이전 게시글에서 필터에 관해 다루었다. 필터에서 인증,인가 절차를 개발자가 직접 구현할수도 있지만 SpringBoot는 개발자의 수고를 덜기 위해 Spring Security를 지원한다.
스프링 시큐리티 사용 전
스프링 시큐리티 사용 후
스프링 시큐리티는 기존의 서비스, 필터에서 이뤄지던 인증,인가 절차를 스프링시큐리티가 진행하여 인증,인가된 데이터만 컨트롤러에 전달해준다. 또한 필터와 같이 사용할수있어 jwt토큰과 같은 인증,인가 수단으로 작성한 필터와 같이 사용할수 있다.
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// CSRF 설정
http.csrf((csrf) -> csrf.disable());
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정
.requestMatchers("/api/user/**").permitAll() // '/api/user/'로 시작하는 요청 모두 접근 허가
.anyRequest().authenticated() // 그 외 모든 요청 인증처리
);
// 로그인 사용
http.formLogin((formLogin) ->
formLogin
// 로그인 처리 (POST /api/user/login)
.loginProcessingUrl("/api/user/login").permitAll()
);
return http.build();
}
스프링 시큐리티는 CSRF(사이트간 위변조 공격)에 대한 기능을 제공하기도 하며 경로를 지정하여 인증,인가 절차를 생략할수있으며 default로그인 폼을 제공하여 서버내부에서 생성된 패스워드로 로그인이 가능하다. 물론 커스텀하여 자신 지정한 html의 로그인양식을 사용하여 아래 사진과같이 DB의 정보와 조회하는 로그인 과정또한 구현가능하다.
로그인 처리과정
스프링 시큐리티는 위 그림과 같이 클라이언트로부터 username과 password를 전달받아 Authentication Manager 와 User Details Service를 통해 DB에 저장된 회원의 정보와 일치하는지 확인 하여 불일치할경우 에러를 발생시키며 일치할경우 세션을 생성한다. 설정에 따라 세션 이 아닌 jwt인증,인가 필터와 같이사용하여 jwt토큰을 발행할수도 있다.
스프링 시큐리티를 사용함으로써 개발자가 직접 구현한 필터의 경우 모든 api URL의 따른 인증여부를 일일히 설정해줘야하는 문제를 해결함으로써 코드의 복잡성과 유지보수비용을 줄일수있어 많은기업들이 사용하고있다.