Content |
스프링 시큐리티와 타임리프를 함께 사용할 때 CSRF(Cross-Site Request Forgery) 토큰을 추가하는 방법은 다음과 같습니다.
1. 스프링 시큐리티 설정:
먼저, 스프링 시큐리티 설정에서 CSRF 토큰을 활성화해야 합니다. 스프링 부트의 경우, 아래와 같이 설정할 수 있습니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.csrf.CsrfFilter;
import org.springframework.security.web.csrf.CsrfTokenRepository;
import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository;
import org.springframework.web.filter.CharacterEncodingFilter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll() // 공개 페이지는 보안 검사에서 제외
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll()
.and()
.addFilterBefore(new CharacterEncodingFilter("UTF-8", true), CsrfFilter.class) // 필요한 경우 문자 인코딩 필터 추가
.csrf()
.csrfTokenRepository(csrfTokenRepository());
}
@Bean
public CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-CSRF-TOKEN"); // HTTP 헤더에 CSRF 토큰 이름을 설정
return repository;
}
}
이 코드에서 configure(HttpSecurity http) 메서드 내에서 CSRF 토큰을 활성화하고 csrfTokenRepository 빈을 정의하여 HttpSessionCsrfTokenRepository를 사용하도록 설정합니다. 또한, setHeaderName을 사용하여 CSRF 토큰이 포함된 HTTP 헤더의 이름을 설정합니다.
2. 타임리프 템플릿에서 CSRF 토큰 사용:
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
|