목차
- Spring Security OAuth2 - Handler
- Spring Security OAuth2 - Login 페이지 Customizing 하기
- Spring Security OAuth2를 이용한 로그인 구현 - 사용자 정보 가져오기
- Spring Security OAuth2를 이용한 로그인 구현 - Spring boot OAuth2 인증 살펴보기
- Spring Security OAuth2를 이용한 로그인 구현 - OAuth2를 이용한 인증 사용하기
- Google OAuth2 인증 방식 이해하기
- OAuth2를 이용한 로그인 구현 이해하기
2. Resource Server로부터 사용자 정보 가져오기
Spring Security 설정하기
OAuth2 인증을 마친 후에 Resource Server로부터 사용자 정보를 가져오기 위해서는 UserInfo EndPoint에 접근할 필요가 있다. HttpSecurity객체의 oauth2Login().userInfoEndpoint().userService() 메소드를 이용해서 UserInfo EndPoint로부터 사용자 정보를 가져올 Service를 등록한다.
|
스프링에서 기본적으로 제공하는 OAuth2Provider
Google, Facebook, Github 등을 통해 OAuth2인증하기 위한 기본적인 설정값들이 들어가 있다. 해당 정보를 통해 ClientRegistration 객체를 생성한다.
- authorizationUri
- 인증을 진행하기 위해 사용하는 URI
- tokenUri
- Resource server로부터 access token을 받기 위해 사용하는 URI
- jwkSetUri
- token의 유효성(서명)을 확인할 수 있는 public key(JSON Web Key)를 받을 수 있는 URI
- userInfoUri
- Resource Server(ex. Google)로부터 사용자 정보를 가져오기 위한 URI
- userNameAttributeName
- Resource server가 제공하는 id값
- clientName
- Resource Server 이름(client Name을 사용할 때도 있다.)
CommonOAuth2Provider.enum
public enum CommonOAuth2Provider { |
Service 생성하기
아래 서비스는 DefaultOAuth2UserService 에 구현된 코드들을 가져와 다시 정의 했다.
Spring Boot에서 OAuth2 인증 방식을 사용하기 위해서는 OAuth2UserService인터페이스를 구현해 loadUser 메소드를 정의해야 한다.
OAuth2UserService 인터페이스를 구현해 사용자가 원하는 서비스를 만든다. DefaultOAuth2UserService 는 스프링에서 제공하는 OAuth2UserService 를 구현한 기본 Class이다.
CustomOAuth2UserService.class
|
OAuth2UserService 는 clinetRegistration 객체와 accessToken 을 가지고 있는 OAuth2UserRequest 를 이용해 UserInfo EndPoint로부터 사용자 정보를 가져올 수 있다.
디버깅을 통해 Spring OAuth2 자세히 살펴보기
userNameAttributeName
- 사용자를 인식할 수 있는 field
- 구글에서는 sub필드를 이용한다.
OAuth2User
- 스프링에서는 기본 구현체로 DefaultOAuth2User 객체를 제공한다.
- authorities, userAttributes, userNameAttributeName 3가지 속성을 가진 OAuth2 User객체이다.
- OAuth2AccessToken
- OAuth2 Access Token을 표현하기 위한 객체
- tokenType : OAuth 인증을 위한 Bearer Token 타입임을 나타낸다.
- scope : 해당 토큰 값으로 접근할 수 있는 정보들을 나타낸다.
- toeknValue : 토큰 값이 들어 있다.
- OAuth2UserRequest
- OAuth2UserRequest객체는 ClientRegistration 객체와, OAuth2AccessToken 객체 그리고 추가적인 데이터를 담기 위한 Map<String, Object> 객체가 존재한다.
- ClientRegistration 객체에는 Resource Server에 등록 정보와 Resource에 접근하기 위한 URI들이 있다.
- OAuth2AccessToken 객체에는 Resource Server로부터 데이터를 가져오기 위해 필요한 Token값이 담겨 있다.
- request 객체를 보면 Header값에 Access Token값이 있다.
- UserInfo URI에 접근해 Access Token을 이용해 인증을 받고 사용자 정보를 받아올 수 있다.
- OAuth2UserRequest 객체내 additionalParamater 에 id_token으로 JWT(JSON Web Token) 이 들어있는 것을 확인할 수 있다.
- JWT 에 대한 유효성 검사는 jwkSetUri 에서 Public Key 값을 가져와 유효성 검사를 진행한다.
- https://jwt.io/ 사이트에 전달 받은 JWT 와 Public Key를 이용하면 유효성 검증과 JWT 내용을 볼 수 있다.
response 객체를 살펴 보면 UserInfo URI로 접근해 인증을 성공적으로 마쳤을 때 사용자 정보를 가져옴을 확인 할 수 있다. 가져오는 사용자 정보는 scope로 명시한 데이터만 가져온다.