OAuth2.0(로그인 시도부터 CustomOAuth2UserService 전까지)
1. 클라이언트 백엔드로 로그인 request
-http://localhost:8080/oauth2/authorization/Google로 요청
2. OAuth2AuthorizationRequestRedirectFilter 동작
-resolve(request) 메서드를 통해 DefaultOAuth2AuthorizationRequestResolver가 동작(객체 생성 기능)
-yml의 정보 + 구글 로그인 서비스의 URL을 담은 OAuth2AuthorizationRequest 객체 생성
***구글 로그인 서비스(https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount~~) 를 거친 후 다시 백엔드로 리다이렉트 해야하기 때문에, 아래의 redirect-uri가 필요한 것.
-sendRedirectForAuthorization(request, response, authorizationRequest)를 통해 구글 로그인 서비스로 리다이렉트
***<주의>google이 아닌, Google(대문자)로 쓸 것.
리다이렉트 후 하나의 쓰레드 종료
3. 구글 로그인
4. OAuth2LoginAuthenticationFilter의 동작
-구글 인증 서버는 위의 OAuth2AuthorizationRequest에서 받아 알고 있는
http://localhost:8080/login/oauth2/code/goolge로 다시 요청을 보냄(로그인 시도 요청)
-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를 통해 생성한다.
-그 후
redirectUri(http://localhost:8080/login/oauth2/code/google)
params
details
를 모아 OAuth2AuthorizationResponse를 만든다.
-만들어진 OAuth2AuthorizationResponse와 OAuth2AuthorizationRequest를 모아 OAuth2AuthorizationExchange가되고 clientRegistration과 함께 OAuth2LoginAuthenticationToken이 된다.
-후에 이 토큰안에 지역변수인 Access Token을 받아온다.
-그 후 manager->provider로 위임(이 과정을 모른다면, spring security를 다시 공부하고 오자.)
-사용되는 provider 구현체는 크게 2가지이다.
1. OAuth2LoginAuthenticationProvider : 아래 provider동작 후(Access 토큰이 OAuth2LoginAuthenticationToken에 담겨서 온다.) 그것을 통해 구글 사용자 정보 api에 Access 토큰과 함께 사용자 정보를 얻어오는 클래스인 CustomOAuth2UserService를 호출하고 return한다.
2.OAuth2AuthorizationCodeAuthenticationProvider : Access 토큰을 받아온다.
- OAuth2LoginAuthenticationToken를 파라미터로 받아, authenticate() 실행.
-AccessToken을 받아 return
-AccessToken을 파라미터로 넘겨주는 userService.loadUser() 메서드
-userService는 이제 만들어야 할 CustomOAuth2UserService이다.
============================================================================================
다형성이 줘어어어~~~~~~~~ㄴ나게 복잡하게 얽혀있다. 사실, 복잡한 건지는 모르겠는데, 코드가 보기 힘들다.
이제, DefaultOAuth2UserService를 살펴보고 CustomOAuth2UserService를 짜는 방법을 알아본다.
그 후, jwt 토큰 방법까지 달려보자.