CSRF란?
- CSRF (Cross-Site Request Forgery)는
사용자가 의도하지 않은 요청을 다른 사이트에서 위조하여 전송하게 만드는 공격 방식.
예를 들어, 사용자가 A사이트에 로그인한 상태에서,
악성 B사이트가
POST
요청을 자동으로 보내 A사이트에서 사용자 몰래 데이터를 조작하게 하는 공격이에요.Spring Security에서의 기본 동작
- Spring Security는 기본적으로 모든
POST
,PUT
,DELETE
요청에 대해 CSRF 토큰을 요구함.
- 즉, 폼 전송 시 CSRF 토큰이 없으면 요청을 거부해요.
→ 그래서 로그인 폼이 작동하지 않거나, POST 요청이 계속 실패하는 경우가 생겨요.
해결 방법: CSRF 비활성화
개발 초기에는 CSRF를 꺼두는 것이 편리함 (특히 API 서버나 로그인 테스트할 때)
어디에 넣나? →
SecurityConfig
안에@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// CSRF 보호 비활성화
http.csrf(config -> config.disable());
http.formLogin(form -> form
.loginPage("/login-form")
.loginProcessingUrl("/login")
.defaultSuccessUrl("/main")
);
http.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/user/**", "/main").authenticated()
.anyRequest().permitAll()
);
return http.build();
}
주의할 점
- 실 서비스에서는 CSRF 보호를 켜야 함!
- 특히 세션 기반 인증일 경우, CSRF를 반드시 활성화해야 보안이 유지됨.
- 단, JWT 기반 API 서버라면 CSRF는 비활성화해도 무방함.
HTML에 임시 키를 심어줌. 서버가 해당 임시 키를 확인하여 정상적인 접근인지 아닌지 확인함.
Share article