모든 요청에 랜덤하게 생선된 토큰을 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)