예전에 팀 프로젝트를 할 당시 로그인을 맡아서 했었는데 완전 햇병아리에다가 처음 코딩을 접할 시기라
security가 진짜 너무 어려웠다..
특히 Oauth는 계속 실패해서 원인조차 찾지 못할 시기가 있었으니..
어디까지 security에서 해주고 (filter와 super.load 등)
나는 어디서부터 어디까지 구현해야할 지 너무 헷갈렸다.
security의 핵심은!
다른 모듈들을 거쳐 UserDetailsService 에서 UserDetails 를 반환,
반환된 UserDetilas 가 SecurityContext 내부의 Authentication에 들어가게 된다.
(이전 글에서 jwt에서 적어놈)
그러나 Oauth의 경우
소셜 로그인은 DefaultOAuth2UserService를 호출, 이는 OAuth2UserService 를 구현한 클래스
DefaultOAuth2UserService 는 일반 로그인과는 다르게 OAuth2User 를 반환하고,
반환된 OAuth2User 가 SecurityContext 내부의 Authentication 에 들어가게 됨

super.loadUser(userRequest): 구글에 요청이 자동으로 간다고?
이 블로그의 핵심이다..

나는 전에 oauth를 실패한 이유가 구글에 자동 요청한다는 것만 믿고 커스텀을 하다 delegete를 시켰고 그 부분에서 항상 에러가 났다.
그러니 실제 user정보들을 구글에서 받아올 수가 없었다..
- 1. userRequest라는 객체를 주면,
- 2.그걸로 구글이나 다른 제공자에 요청을 보내서 데이터를 받아옴
-
헤더에 Bearer <액세스 토큰> 붙여서 요청.
-
응답으로 JSON(예: {email: "hanjun@example.com", name: "hanjun"}) 받아옴.
1. DefaultOAuth2UserService클래스의 super.loadUser()

2. getResponse()

우리가 아는 RestTemplate은인터페이스 RestOperations의 구현체이다
실제로 이 인터페이스를 활용해서 요청을 보냄!
요청흐름 총정리

1차 http사이클
요청 - 사용자가 oauth2를 사용하기 위해 우리 앱에 내가 지정한 path로 요청을 보냄 (get /myapp/path)

2차 http 사이클
요청 - 사용자가 redirect된 페이지인 구글 로그인 창에 이메일/ 비밀번호 입력 (post body : "id : ~ ", "pw : ~~ ")
응답 - 구글 *토큰* 서버가 확인 후 내 앱으로 code를 붙여서 redirect해줌 (302 응답)

3차 http 사이클
요청 - **OAuth2LoginAuthenticationFilter** 에서 code와 내가 yml에 저장한 id,secret들을 가지고
구글 *토큰* 서버에 Access token 요청을 보냄 (정보가 아닌 실제 유저 정보에 얻기위한 서버의 access 토큰을 요청)
응답 - 구글 *토큰* 서버가 *api* 서버에 입장가능한 토큰을 반환 (json - "access_token": "ya29.a0AfH6S...",)

4 http 사이클 (이번 글 주제)
요청 - 구글 *api*서버에 토큰을 가지고 정보를 요청 get /google~
응답 - json { "sub": "110169484474386276334", "name": "John Doe"}

이때 받은 정보를 저장 및 활용!하면 된다..
내가 구현해야 하는 것 vs 자동 처리되는 것
자동 처리되는 것 (Spring Security가 알아서 함)
- 구글 로그인 페이지로 리다이렉트 (OAuth2AuthorizationRequestRedirectFilter)
- 구글이 인증 코드 반환
- 액세스 토큰 요청 (OAuth2LoginAuthenticationFilter)
- 액세스 토큰으로 사용자 정보 요청 (super.loadUser())
- OAuth2User 객체 생성 및 인증 완료
우리가 직접 구현해야 하는 것
- OAuth2UserService (OAuth2UserCustomService)
→ 사용자 정보를 가공해서 DB에 저장하는 역할 - OAuth2SuccessHandler (선택)
→ 로그인 성공 후, JWT 생성 & 프론트엔드로 리다이렉트 처리 - Security 설정 (SecurityConfig)
→ OAuth2 엔드포인트 설정 & 커스텀 서비스 등록
https://developers.google.com/assistant/df-asdk/identity/gsi-oauth-concept-guide?hl=ko
OAuth 및 Google 로그인 개념 가이드 (Dialogflow) | Actions on Google account linking | Google for Developers
대화형 작업이 2023년 6월 13일에 지원 중단되었습니다. 자세한 내용은 대화 작업 지원 중단을 참고하세요. 이 페이지는 Cloud Translation API를 통해 번역되었습니다. OAuth 및 Google 로그인 개념 가이드
developers.google.com
'프로젝트' 카테고리의 다른 글
블로그 만들기 - OAuth2 handler가 동작하지 않는 에러 (0) | 2025.04.03 |
---|---|
블로그 만들기 - Security config설정들 (0) | 2025.04.01 |
블로그 만들기 - cookie와 util 클래스를 static으로? (0) | 2025.03.30 |
블로그 만들기 - 환경변수 dotenv으로 관리 (0) | 2025.03.30 |
블로그 만들기 - controller test (ObjectMapper) (0) | 2025.03.29 |