HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
♥️
2기 최종 프로젝트 팀별 공간
/
👩‍👩‍👦‍👦
[팀01] 김팽박이
/
🌝
What we learn
/
👀
OAuth2 + JWT (1)
👀

OAuth2 + JWT (1)

notion image
 
  1. 로그인 성공 시 AuthenticationSuccessHandler 에서 인증서버로 부터 인증된 principal 을 가지고 와서 최초로그인 시 service 를 호출하여 저장을 한다.
  1. accesstoken 을 생성한 후 header 에 담아 RedirectStrategy 를 통해 /main 으로 redirect 한다
  1. refreshtoken 을 생성한 후 redis 에 저장한다.
  1. accesstoken 만료 시 AuthenticationFilter 에서 redis 에 있는 refreshtoken 을 통해 유효한 accesstoken 을 갱신하여 header 에 담은 후 해당 reqeust 를 마저 수행한다.
  1. 로그아웃 시 클라이언트의 accesstoken 을 만료시키고 accesstoken 을 redis 에 저장한다. 해당 accesstoken 을 접근 시 접근을 차단한다. 그 후 accesstoken 의 유효기간이 지나면 redis 에서 제거한다.
  1. 로그아웃 시 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(); } }