Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임 워크
➡️ 인증과 권한에 대한 부분을 Filter 흐름에 따라 처리(보안 처리를 자체적으로 구현하지 않아도 필요한 기능 쉽게 구현 가능)
✔️ 인증(Authenticate)
해당 사용자가 본인이 맞는지 확인하는 절차
ex.로그인
✔️ 인가(Authorize)
인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차
➡️ 스프링의 DispatcherServlet 앞단에 Filter 형태로 위치
Dispatcher로 넘어가기 전에 Filter가 요청을 가로채서 클라이언트의 리소스 접근 권한을 확인하고 없는 경우 인증 요청 화면으로 자동 redirect
➡️ UsernamePasswordAuthenticationFilter : 클라이언트가 리소스레 대한 접근 권한이 없을 때 처리를 담당하는 필터
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic().disable() // rest api 이므로 기본설정 사용안함. 기본설정은 비인증시 로그인폼 화면으로 리다이렉트
.cors().configurationSource(corsConfigurationSource())
.and()
.csrf().disable() // rest api이므로 csrf 보안이 필요없으므로 disable처리.
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) // jwt token으로 인증하므로 세션은 필요없으므로 생성안함.
.and()
.authorizeRequests() // 다음 리퀘스트에 대한 사용권한 체크
.antMatchers("/*/signin", "/*/signin/**", "/*/signup", "/*/signup/**", "/social/**").permitAll() // 가입 및 인증 주소는 누구나 접근가능
.antMatchers(HttpMethod.GET, "home/**").permitAll() // home으로 시작하는 GET요청 리소스는 누구나 접근가능
.anyRequest().hasRole("USER") // 그외 나머지 요청은 모두 인증된 회원만 접근 가능
.and()
.addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class); // jwt token 필터를 id/password 인증 필터 전에 넣는다
}
✔️ CSRF(Cross Site Request Forgrey)
웹 사이트 취약점 공격 방지를 위햐 사용하는 기술
스프링 시큐리티가 CSRF 토큰 값을 세션을 통해 발행하고 웹 페이지에서는 폼 전송시 해당 토큰을 함께 전송하여 실제 웹 페이지에서 작성된 데이터가 전달되는지를 검증하는 기술
[참고 자료]