- 로그인 성공 시
AuthenticationSuccessHandler
에서 인증서버로 부터 인증된 principal 을 가지고 와서 최초로그인 시 service 를 호출하여 저장을 한다.
- accesstoken 을 생성한 후 header 에 담아
RedirectStrategy
를 통해 /main 으로 redirect 한다
- refreshtoken 을 생성한 후 redis 에 저장한다.
- accesstoken 만료 시
AuthenticationFilter
에서 redis 에 있는 refreshtoken 을 통해 유효한 accesstoken 을 갱신하여 header 에 담은 후 해당 reqeust 를 마저 수행한다.
- 로그아웃 시 클라이언트의 accesstoken 을 만료시키고 accesstoken 을 redis 에 저장한다. 해당 accesstoken 을 접근 시 접근을 차단한다. 그 후 accesstoken 의 유효기간이 지나면 redis 에서 제거한다.
- 로그아웃 시 redis 의 refreshtoken 을 만료시킨다.
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final CustomOAuth2UserService oAuth2UserService;
private final OAuth2SuccessHandler successHandler;
private final TokenService tokenService;
private final RefreshTokenRedisRepo refreshTokenRedisRepo;
private final TokenGenerator tokenGenerator;
@Bean
public AuthenticationEntryPoint authenticationEntryPoint() {
return (request, response, e) -> {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.sendRedirect("/login");
};
}
@Bean
public AccessDeniedHandler accessDeniedHandler() {
return (request, response, e) -> {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.sendRedirect("/login");
};
}
@Bean
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.formLogin(AbstractHttpConfigurer::disable)
.logout(AbstractHttpConfigurer::disable)
.rememberMe(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement(
sessionManagement -> sessionManagement
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.authorizeRequests(
authorizeRequests -> authorizeRequests
.antMatchers("/token/**", "/login/**", "/signup/**","/api/user/**")
.permitAll()
.antMatchers(GET, "/api/user/**")
.hasAnyAuthority(ROLE_USER.stringValue)
.anyRequest().authenticated()
)
.oauth2Login(
oauth2Login -> oauth2Login
.successHandler(successHandler)
.userInfoEndpoint()
.userService(oAuth2UserService)
)
.exceptionHandling(
exceptionHandling -> {
exceptionHandling.authenticationEntryPoint(authenticationEntryPoint());
exceptionHandling.accessDeniedHandler(accessDeniedHandler());
}
)
.addFilterBefore(
new JwtAuthenticationFilter(tokenService, tokenGenerator, refreshTokenRedisRepo),
UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}