Search
Duplicate
📒

[Spring Security] 02-2. Google Login ⭐

상태
미진행
수업
Spring Security
주제
Security
4 more properties
참고

Google Login 설정!

NOTE
구글 OAuth로그인을 위해서는 먼저 구글 클라우드 플랫폼에 가서 설정을 해주어야 한다!

구글 클라우드 플랫폼

NOTE
자세한 과정은 참고링크에 걸어두었으니, 핵심만 소개한다.

승인된 리디렉션

승인된 리디렉션 URI에 "http://localhost:8080/login/oauth2/code/google"을 입력한다.
밑줄친 부분은 정해진 내용이라 바꾸면 안된다! (공식문서 참조)

클라이언트 ID, 클라이언트 비밀번호

잘 기억해두자 나중에 쓴다.

OAuth2 설정

NOTE

build.gradle > dependency 추가

implementation 'org.springframework.boot:spring-boot-starter-oauth2-client:2.6.2'
Java
복사

yaml 추가

spring: security: oauth2: client: registration: google: client-id: 30818697785-7oraok4rh34lkjuig9deo0tcttcsi6vv.apps.googleusercontent.com client-secret: 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 scope: - email - profile
YAML
복사
client-id와 client-secret값에 구글 클라우드 플랫폼에서 얻어왔던 정보를 입력한다!

SecurityConfig 수정

@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { // ... http.oauth2Login() .loginPage("/loginForm") // 인증이 필요한 URL에 접근하면 /loginForm으로 이동 .defaultSuccessUrl("/") // 로그인 성공하면 "/" 으로 이동 .failureUrl("/loginForm") // 로그인 실패 시 /loginForm으로 이동 .userInfoEndpoint() // 로그인 성공 후 사용자정보를 가져온다 .userService(principalOauth2UserService); //사용자정보를 처리할 때 사용한다 return http.build(); }
Java
복사
.oauth2Login()
OAuth2기반으로 로그인 할 경우의 설정을 추가할 수 있다.OAuth2LoginConfigurer를 불러온다
.loginPage(String url)
로그인 페이지 경로를 호출한다.
.defaultSuccessUrl(String url)
로그인 성공 시 url로 이동한다.
.failureUrl(String url)
로그인 실패 시 url로 이동한다.
.userInfoEndpoint()
로그인 성공 후 사용자 정보를 가져온다
.userService(Class)
userInfoEndpoint()로 가져온 사용자 정보를 처리할 때 사용g한다.

Google Login 후처리

NOTE
구글 로그인이 정상적으로 처리가되면 다음의 과정을 진행해야 한다.
1.
코드받기(인증)
구글에 정상적으로 로그인했다고 인증이 되었다.
2.
엑세스 토근받기
사용자 정보에 접근할 권한이 생긴다.
3.
사용자 프로필 정보 가져오기
4.
정보를 통해서 회원가입
추가정보가 필요할 시에는 받아야 한다.

PrincipalDetails

NOTE
일반 로그인 사용자(폼 로그인)OAuth2 로그인 사용자 모두 Principal를 객체로 받기 위해서 UserDetailsOAuth2User 둘다 구현받고 생성자를 추가한다!
원래는 UserDetails와 OAuth2User의 타입이 달라서 명시해주기 어려웠다.

Authentication

인증에 성공한 유저는 Authentication 객체를 만들어 정보를 채운다.

@AuthenticationPrincipal

세션 정보 UserDetails에 접근할 수 있는 어노테이션
전체코드

OAuth2UserService

NOTE
DefaultOAuthUserService는 OAuth2로그인 시 loadUserByUsername메서드로 로그인한 유저가 DB에 저장되어있는지를 찾는다!
OAuth2로 로그인하는 사용자는 회원가입을 거치지 않기 때문에, DB에 유저가 없다면 자동으로 회원가입 처리해준다!
유저가 있다면 Authentication(OAuth2를 구현한 PrincipalDetails)를 반환하여 SecurityContextHolder에 저장할 수 있게 한다.
전체코드

참고

//인증서버(구글)의 정보를 가져온다 userRequest.getClientRegistration(); 결과 : ClientRegistration{ registrationId='google', clientId='~', clientSecret='~', clientAuthenticationMethod=org.springframework.security.oauth2.core.ClientAuthenticationMethod@4fcef9d3, authorizationGrantType=org.springframework.security.oauth2.core.AuthorizationGrantType@5da5e9f3, redirectUri='{baseUrl}/{action}/oauth2/code/{registrationId}', scopes=[profile, email], providerDetails=org.springframework.security.oauth2.client.registration.ClientRegistration$ProviderDetails@5b8ec6e5, clientName='Google' } //인증 토큰값을 가져온다 userRequest.getAccessToken().getTokenValue(); 결과 : Tokenvalue~~ //유저의 정보를 가져온다 super.loadUser(userRequest).getAttributes(); 결과 : { sub=~(PK 같은거), name=~, given_name=~, family_name=~, picture=~, email=~, email_verified=true, locale=ko }
Java
복사