매주 스프링 부트 핵심 가이드 를 읽으며 이전에 궁금했거나, 새롭게 알게 된 내용들을 정리했다.
(이번 주는 13장을 읽었다.)
위 그림은 스프링 시큐리티의 보안 필터체인 중 기본값인
UsernamePasswordAuthenticationFilter
를 통한 인증 과정이다. 위 필터는 접근 권한을 확인하고 인증이 실패하면 로그인 폼을 보내는 역할을 수행한다. 화면이 없는 어플리케이션의 경우 다른 필터에서 인증 및 인가 처리를 수행해야 하는데, 그러한 인증 방법으로 JWT 토큰을 활용한 방법이 있다.
토큰을 생성하고 정보를 해석해 인증을 수행하는 클래스 -> 이 클래스를 활용한 필터
위에서 구현한 필터는 스프링 시큐리티를 적용하기 위한 컴포넌트이다. 다음은 WebSecurityConfigureAdapter
를 상속받는 Configuration
클래스를 구현하는 것이다. configure()
메소드에 작성될 수 있는 설정 코드는 다음과 같다. 모든 설정은 전달받은 HttpSecurity
에 설정하게 된다.
httpBasic.disable()
UI를 사용하는 기본값을 가진 시큐리티 설정을 비활성화한다.
csrf.disable()
CSRF(사이트 간 요청 위조, 웹 어플리케이션의 취약점 중 하나로 특정 페이지의 보안을 취약하게 하는 방법이다.) 보안을 비활성화한다. 브라우저 사용 환경이 아니라면 비활성화해도 문제가 되지 않는다.
sessionManagement().sessionCreationPolicy(SessionCreationPolicy)
REST API 기반 어플리케이션의 동작 방식을 설정한다. SessionCreationPolicy
에는 세션을 사용함에 따라 결정한다.
authorizeRequest()
어플리케이션에 들어오는 요청에 대한 권한을 체크한다. antMatcher()
는 antPattern
을 통해 권한을 설정한다. permitAll()
, antMatchers(HttpMethod.GET, "/api/**).permitAll()"
, .anyRequest().hasRole("ADMIN")
등 요청별, 링크별 다양한 권한 설정이 가능하다.
exceptionHandling().accessDeniedHandler()
권한을 확인하는 과정에서 통과하지 못하는 예외가 발생하면 예외를 전달한다.
exceptionHandling().authenticationEntryPoint()
인증 과정에서 예외가 발생하면 예외를 전달한다.