모든 요청에 랜덤하게 생선된 토큰을 HTTP파라미터로 요구
요청 시 전달되는 토큰 값과 서버에 저장되는 실제 값과 비교한 후 만약 일치하지 않으면 요청은 실패한다.
Client
<input type=”hidden” name=”${_csrf.parameterName}” value=”${_csrf.token}” />
Spring Security
@Configuration
@EnableWebSecurity
@Order(0) //두개 이상의 설정이면 항상 순서를 정해줘야 된다.
public class SecurityConfig_02_02 extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/admin/**")
.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic();
}
}
@Configuration
@Order(1) // 만약 순서를 바꾸면 안된다. 넓은 범위를 뒤에 놔야됨, 좁은범위가 넓은범위에 십힘
class SecurityConfig_02_02_2 extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().permitAll() // 어떤 요청이든 허용
.and()
.formLogin();
}
}
WebSecurity
에 들어가서 FilterChainProxy
를 생성하면서 securityFilterChains
라는 객체를 전달해준다requestMatcher
라는 변수에 각각(”/admin/**")
와 any request
가 들어가있고 각각 filter가 들어가 있다. 전자는 httpBasic
이라12개후자는 formLogin
이라 password와 디폴트 경로설정등 합쳐서 14개가 들어가 있다.당신이 누구인지 증명하는 것
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
SecurityContextHolder.getContext().setAuthentication(authResult)