안녕하딤니카? 재영입니다
이번에는 저번 글에 이어서 소셜 로그인의 전체 프로세스를 정리해보겠습니다
이 흐름을 모르고 구현하면... 이제 어디서 팡팡 터지는 미치겠는 에러를 못 잡는 경우가 있어서
프로세스를 이해하고 소셜 로그인을 구현하면! 좀 더 스무스하게 구현할 수 있습니다!
그럼~ 시작
- 소셜 로그인을 직접 구현하는 과정은 이전 글에서 설명해두었습니다! 이 글을 참고해주세요!
Spring Boot 3.x + Spring Security 6 + OAuth2 활용한 소셜 로그인 기능 구현하기 - 쇼핑몰 개인 프로젝트 01
안녕하딤니카?한참 티스토리 글을 안 올리다가 이제야 돌아왔습니다사실 쓸 글은 많았는데 우선순위로 두지 않아서 이모양 이 꼴이 되었음 ㅜ이제 프로젝트도 어느정도 정리 되었고 지금부터
chuuuu1224.tistory.com
1. 사용자 인증 요청
사용자가 웹 애플리케이션에서 소셜 로그인을 요청하면 (버튼 클릭을 한다던지...)
사용자는 OAuth2 제공자 (구글, 네이버, 카카오 등등...) 의 인증 페이지로 리다이렉트됩니다.
2. Spring Security 설정 (SecurityFilterChain)
Spring Security 설정 (SecurityConfig)에서 SecurityFilterChain 를 사용해서 필터 체인을 구현하는데, 그 안에 oauth 설정을 진행합니다.
// oauth2
http
.oauth2Login((oauth2) -> oauth2
.userInfoEndpoint((userInfoEndpointConfig) -> userInfoEndpointConfig
.userService(customOAuth2UserService)));
여기서 CustomOAuth2UserService 를 스프링 시큐리티에 등록하면,
OAuth2 로그인 프로세스 중 사용자 정보를 가져오는 단계에서 CustomOAuth2UserService 안의 유저 정보를 가져오고, 등록하는 과정의 메서드 (loadUser) 가 호출됩니다. 그래서 이 부분을 잘 등록하는 것이 중요합니다!
SecurityFilterChain 은 OAuth2 로그인 프로세스를 처리하는 데 필수적인 필터들이 포함되어있습니다.
1) OAuth2AuthorizationRequestRedirectFilter
사용자가 소셜 로그인 버튼을 클릭하면, 이 필터가 활성화되어 사용자를 OAuth2 제공자의 인증 페이지로 리다이렉트합니다. 이 필터는 인증 요청을 구성하고 적절한 OAuth2 제공자에게 전송하는 역할을 합니다.
2) OAuth2LoginAuthenticationFilter
OAuth2 제공자로부터 인증 응답을 받을 때 이 필터가 활성화됩니다. 이 필터는 인증 토큰을 추출하고, AuthenticationManager에게 전달하여 인증 과정을 진행합니다.
3) DefaultOAuth2UserService
이 서비스는 OAuth2LoginAuthenticationFilter에 의해 사용됩니다. 제공자로부터 받은 사용자 정보를 가져오기 위해 사용자 정보 엔드포인트에 요청을 보냅니다. 이 과정에서 사용자의 상세 정보를 포함한 OAuth2User 객체를 반환합니다.
4) CustomOAuth2UserService:
DefaultOAuth2UserService를 확장하거나 대체하여 구현됩니다. 사용자 정보를 로드한 후 추가적인 로직(예: 데이터베이스 조회 및 저장, 사용자 식별자 생성)을 실행하여 사용자의 정보를 처리하고 CustomOAuth2User 객체로 포장하여 반환합니다. 이 사용자 서비스는 OAuth2LoginAuthenticationFilter에 의해 사용되며, 사용자 정보를 더 잘 관리하기 위해 커스터마이징됩니다.
5) AuthenticationSuccessHandler 및 AuthenticationFailureHandler:
인증이 성공하거나 실패했을 때 각각 실행되는 핸들러입니다. 성공 핸들러는 일반적으로 사용자를 원래 요청했던 URL 또는 기본 URL로 리다이렉트하고, 실패 핸들러는 오류 페이지 또는 로그인 페이지로 사용자를 안내합니다.
이 필터들은 SecurityFilterChain 내에서 정의되어 서로 연쇄적으로 작용하여 OAuth2 로그인 프로세스를 완성합니다!
(따봉시큐리티야고마워~
3. 사용자 인증 및 정보 로드
사용자가 소셜 미디어를 통해 로그인을 하면, OAuth2 제공자는 사용자의 정보와 함께 엑세스 토큰을 반환합니다.
SecurityConfig에 등록된 CustomOAuth2UserService의 loadUser 메소드가 자동으로 호출되어 사용자 정보를 처리합니다.
4. 사용자 정보 처리 (CustomOAuth2UserService 로직)
CustomOAuth2UserService 에서는 OAuth2 제공자로부터 받은 사용자 정보를 기반으로 필요한 로직을 수행합니다.
CustomOAuth2UserService는 스프링 시큐리티가 제공하는 DefaultOAuth2UserService 를 상속받아 loadUser 메서드를 오버라이드하는데, 이 메서드는 OAuth2 제공자로부터 사용자 정보를 요청하고, 응답을 받습니다.
4-1. 응답 처리
응답으로 받은 OAuth2User 객체에서 사용자 데이터를 추출합니다.
여기서 OAuth2 제공자마다 응답 형식이 다릅니다. (ProviderId 반환 형식이 다릅니다. 구글은 sub, 네이버는 id 등등...)
그래서 각 제공자에 맞춰서 Response 클래스를 따로 사용하여 각각의 데이터 형식에 맞게 파싱해주는 것이 중요합니다.
4-2. 사용자 식별자 생성 및 DB 조회
OAuth2 제공자의 이름, 고유 ID를 조합하여 서비스에서 사용할 유니크한 식별자를 생성합니다. 이 식별자는 데이터베이스에서 해당 사용자의 존재 유무를 확인할 때 사용합니다.
4-3. 데이터베이스 저장 또는 업데이트 로직 구현
만약 사용자가 처음 로그인하는 경우, 새로운 엔티티를 생성하고, 받아온 데이터를 저장합니다.
이미 데이터베이스에 존재하는 사용자라면, 이름이나 이메일 같은 정보를 확인해서 업데이트합니다.
4-4. CustomOAuth2User 의 생성과 반환
데이터베이스 작업이 완료된 후, 사용자의 정보를 담고있는 CustomOAuth2User 객체를 생성합니다.
이 객체는 스프링 시큐리티의 인증 과정에서, 사용자의 인증 상태를 관리하는데 필요한 정보 (사용자 세션, Role 등) 를 포함합니다.
5. OAuth2AuthenticationToken 생성
스프링 시큐리티는 SecurityConfig 에서 등록한 서비스 계층 (CustomOAuth2UserService) 에서
loadUser 메소드가 OAuth2User를 반환하면, Spring Security는 이 정보를 사용하여 OAuth2AuthenticationToken을 생성합니다.
OAuth2AuthenticationToken이 생성되어 Security Context에 저장됨으로써, 시스템은 사용자가 인증된 상태임을 인식하고, 이후의 요청을 인증된 사용자로서 처리합니다.
6. 컨트롤러에서의 접근
컨트롤러에서는 OAuth2AuthenticationToken 을 파라미터로 받아 사용자의 인증 정보를 사용할 수 있습니다.
더 나아가 컨트롤러는 이 토큰을 활용하여 사용자의 세부 정보에 접근하고, 사용자의 요청에 따라 적절한 서비스를 제공합니다.
Sping Security 가 있어서 안전한 인증 프로세스로 SNS 로그인을 구현할 수 있다... 라고 정리할 수 있습니다
테스트삼아 시큐리티 없이도 구현 해봤는데, 스프링 시큐리티의 고마움을 느낄 수 있었습니다... (따봉시큐리티야고마워~222
제가 정리할라고 적어봤는데... 다소 두서가 없어도 봐주시길 바라며 (???
마무리 어떻게 해야하지...?
그럼 20000!
🍀
좋아하는 것을 계속 좋아하세요!
반드시 행복해집니다
[Github] https://github.com/chujaeyeong
[E-mail] chujy1224@gmail.com
'Project' 카테고리의 다른 글
| Swagger 도구를 사용한 API 문서 작성 방법과 사용 시 이점 - 쇼핑몰 프로젝트 06 (1) | 2024.06.09 |
|---|---|
| JPA CascadeType 설정으로 인한 리뷰 삭제 문제 해결하기 - 쇼핑몰 프로젝트 05 (2) | 2024.06.08 |
| Principal 객체를 활용하여 인증된 사용자의 정보를 반환하기 - 쇼핑몰 프로젝트 04 (3) | 2024.05.27 |
| 여러 유형의 회원을 하나의 엔티티로 관리하기 - 쇼핑몰 개인 프로젝트 03 (0) | 2024.05.27 |
| Spring Boot 3.x + Spring Security 6 + OAuth2 활용한 소셜 로그인 기능 구현하기 - 쇼핑몰 개인 프로젝트 01 (2) | 2024.05.15 |