OAuth+JWT

OAuth2.0(로그인 시도부터 CustomOAuth2UserService 전까지)

쥐4 2024. 10. 12. 04:19

1. 클라이언트 백엔드로 로그인 request

-http://localhost:8080/oauth2/authorization/Google로 요청

 

2. OAuth2AuthorizationRequestRedirectFilter 동작

<OAuth2AuthorizationRequestRedirectFilter>

 

<DefaultOAuth2AuthorizationRequestResolver>
<DefaultOAuth2AuthorizationRequestResolver>

-resolve(request) 메서드를 통해 DefaultOAuth2AuthorizationRequestResolver가 동작(객체 생성 기능)

-yml의 정보 + 구글 로그인 서비스의 URL을 담은 OAuth2AuthorizationRequest 객체 생성

***구글 로그인 서비스(https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount~~) 를 거친 후 다시 백엔드로 리다이렉트 해야하기 때문에, 아래의 redirect-uri가 필요한 것.

-sendRedirectForAuthorization(request, response, authorizationRequest)를 통해 구글 로그인 서비스로 리다이렉트

<yml 설정 정보>

***<주의>google이 아닌, Google(대문자)로 쓸 것.

리다이렉트 후 하나의 쓰레드 종료

 

3. 구글 로그인

<로그인 화면>
<로그인 시도>

 

 

4. OAuth2LoginAuthenticationFilter의 동작

-구글 인증 서버는 위의 OAuth2AuthorizationRequest에서 받아 알고 있는

http://localhost:8080/login/oauth2/code/goolge로 다시 요청을 보냄(로그인 시도 요청)

<OAuth2LoginAuthenticationFilter>

-request와 yml 정보를 통해

params(state, code, scope, authuser, prompt들의 정보)

***params의 code를 포함해 구글 인증 서버에 Access 토큰 요청 코드(response)를 만들 수 있는 것 같다. 때문에, 다른 강의들에서 '로그인 후 code를 보낸다.'고 하는듯.

OAuth2AuthorizationRequest

registrationId("Google")

ClientRegistration(클라이언트 정보)

***여기서 클라이언트는 백엔드라고 할 수 있다. 백엔드가 클라이언트의 역할까지 대신???하고 있기 때문.

를 알 수 있음.

***중간에

OAuth2AuthorizationRequest authorizationRequest = this.authorizationRequestRepository.removeAuthorizationRequest(request, response);

이 메서드는 SecurityConfig에서 세션 허용하면, 세션에서 가져오고, 허용하지 않으면, request를 통해 생성한다.

<OAuth2LoginAuthenticationFilter>

-그 후

redirectUri(http://localhost:8080/login/oauth2/code/google)

params

details

를 모아 OAuth2AuthorizationResponse를 만든다.

-만들어진 OAuth2AuthorizationResponse와 OAuth2AuthorizationRequest를 모아 OAuth2AuthorizationExchange가되고 clientRegistration과 함께 OAuth2LoginAuthenticationToken이 된다.

-후에 이 토큰안에 지역변수인 Access Token을 받아온다.

<provider로 위임하기 위한 코드>

-그 후 manager->provider로 위임(이 과정을 모른다면, spring security를 다시 공부하고 오자.)

-사용되는 provider 구현체는 크게 2가지이다.

1. OAuth2LoginAuthenticationProvider : 아래 provider동작 후(Access 토큰이 OAuth2LoginAuthenticationToken에 담겨서 온다.) 그것을 통해 구글 사용자 정보 api에 Access 토큰과 함께 사용자 정보를 얻어오는 클래스인 CustomOAuth2UserService를 호출하고 return한다.

2.OAuth2AuthorizationCodeAuthenticationProvider : Access 토큰을 받아온다.

 

<OAuth2LoginAuthenticationProvider>

- OAuth2LoginAuthenticationToken를 파라미터로 받아, authenticate() 실행.

<OAuth2AuthorizationCodeAuthenticationProvider>

-AccessToken을 받아 return

<OAuth2LoginAuthenticationProvider>

-AccessToken을 파라미터로 넘겨주는 userService.loadUser() 메서드

-userService는 이제 만들어야 할 CustomOAuth2UserService이다.

 

 

============================================================================================

다형성이 줘어어어~~~~~~~~ㄴ나게 복잡하게 얽혀있다. 사실, 복잡한 건지는 모르겠는데, 코드가 보기 힘들다.

이제, DefaultOAuth2UserService를 살펴보고 CustomOAuth2UserService를 짜는 방법을 알아본다.

그 후, jwt 토큰 방법까지 달려보자.