0. 프로젝트 소개(Spring Security) 및 Security에 대하여
1. User Entity 생성(Spring Security)
2. User 회원가입 (Spring Secureity)
3.Jwt의 사용 이유 (Spring Security)
4. Authorization(인증)
- 4-0 Authorization(인증) - 프로세스 설명
- 4-1 Authentication(인증) - UserDetails, UserDetailsService 및 JwtService 생성
- 4-2 Authentication(인증) - UsernamePasswordAuthenticationfilter 생성
- 4-3 Authentication(인증) - CorsFilter(선택사항)
- 4-4 Authentication(인증) - SecurityConfig
5. Authorization(인가)
- 5-1 Authorization(인가) - Jwt 인가 관련 에러 처리
- 5-2 Authorization(인가) - Jwt 인가 서비스 로직 추가
- 5-3 Authorization(인가) - AuthorizationFilter 생성
- 5-4 Authorization(인가) - SecurityConfig에 인가 관련 method 추가
6. OAuth
- 6-0 OAuth에 대해서
- 6-1 OAuth 2.0 - 사전 설정
- 6-2 OAuth2.0 - DTO 설정
- 6-3 OAuth2.0 - OAuth2UserService
- 6-4 OAuth2.0 - OAuth2UserService
- 6-5 OAuth2.0 - 필터 생성 및 SecurityConfig 수정
AuthenticationSuccessHandlerImpl
@Slf4j
@Component
@RequiredArgsConstructor
public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler {
private final JwtService jwtService;
@Override
public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication authentication) throws IOException, ServletException {
try {
CustomOAuth2User cusOAuth2User = (CustomOAuth2User) authentication.getPrincipal();
if(cusOAuth2User.getUserRole().equals("ROLE_USER")) {
String accessToken = jwtService.createAccessToken(cusOAuth2User.getEmail());
String refreshToken = jwtService.createRefreshToken();
jwtService.setAccessTokenToHeader(res, accessToken);
jwtService.setRefreshTokenToHeader(res, refreshToken);
jwtService.updateRefreshToken(cusOAuth2User.getEmail(), refreshToken);
}
} catch (AuthenticationException e) {
log.info("******************************************************************");
log.info("인가 에러>>>>>>>>>>>>>>>>>>"+e.getMessage());
log.info("******************************************************************");
req.setAttribute(JwtProperties.Exception, e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
- OAuth 인증이 성공적으로 진행되었다면 실행되는 필터
프로세스
1. CustomOAuth2User 객체 생성
CustomOAuth2User cusOAuth2User = (CustomOAuth2User) authentication.getPrincipal();
- getPrincipal()을 통해 securitty session에 있는 User를 가져온다.
2. 권한 점검 후 로직 실행
if("ROLE_USER".equals(cusOAuth2User.getUserRole())) {
String accessToken = jwtService.createAccessToken(cusOAuth2User.getEmail());
String refreshToken = jwtService.createRefreshToken();
jwtService.setAccessTokenToHeader(res, accessToken);
jwtService.setRefreshTokenToHeader(res, refreshToken);
jwtService.updateRefreshToken(cusOAuth2User.getEmail(), refreshToken);
}
- "ROLE_USER" 문자열과 User의 권한을 비교하여 토큰 생성 후 header에 넣어준다.
AuthenticationFailureHandler
@Slf4j
@Component
public class AuthenticationFailureHandlerImpl implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.getWriter().write("소셜 로그인 실패! 서버 로그를 확인해주세요.");
log.info("소셜 로그인에 실패했습니다. 에러 메시지 : {}", exception.getMessage());
}
}
- OAuth 인증 실패 시 실행되는 필터
SecurityConfig에 코드 추가
.oauth2Login()
.successHandler(authenticationSuccessHandler)
.failureHandler(authenticationFailureHandler)
.userInfoEndpoint().userService(oAuth2UserService); // customUserService 설정;
oau2th2Login()
- OAuth2 로그인을 판가름해주며 reuqestUri(/login/oauth2/code/{registrationId})을 통해 들어올 시 실행되는 method이다.
OAuth2LoginConfigurer
oauth2Login()을 활성화시키기 위해서는 OAuth2에서 정해논 Path를 사용해야한다.
public OAuth2LoginConfigurer<HttpSecurity> oauth2Login() throws Exception {
return (OAuth2LoginConfigurer)this.getOrApply(new OAuth2LoginConfigurer());
}
oauth2Login()을 자세히 들여다 보면 OAuth2LoginConfigurer클래스를 파라미터로 넣어야되는것을 확인 할 수 있다.
OAuth2LoginConfigurer에 선언된 변수들 중 loginProcessingUrl을 살펴보면
private String loginProcessingUrl = "/login/oauth2/code/*";
"/login/oauth2/code/*"로 지정되어 있는 것을 확인 할 수 있다.
따라서 redirect_URI에 위에 작성된 path를 사용해야 client가 OAuth2 로그인이라는 것을 인지하여 oauth2login()을 활성화 할 수 있는 것이다.
'SpringBoot Security' 카테고리의 다른 글
6-4 OAuth2.0 - OAuth2UserService (0) | 2023.08.27 |
---|---|
6-3 OAuth2.0 - OAuthAttribute (0) | 2023.08.27 |
6-2 OAuth2.0 - DTO 설정 (0) | 2023.08.24 |
6-1 OAuth 2.0 - 사전 설정 (0) | 2023.08.06 |
6-0 OAuth에 대해서 (0) | 2023.07.25 |