어플리케이션 사용자를 OAuth2.0, OpenID Connect로 로그인 할 수 있는 기능 제공
소셜로그인을 구현해서 사용
AuthorizationCode
방식 사용
위 Login과 비슷하나 AuthorizationCode 방식이 아닌 다른 방식 API 제공
ex) Client Credential, RefreshToken 등
클라이언트 인가서버에게 권한부여, 토큰 요청을 할 때 클라이언트 정보 및 엔드포인트 정보가 필요하다.
이 정보는 application.yml
에 클라이언트 설정과 엔드포인트 설정을 해야한다.
application.yml
에 있는 속성이 OAuth2ClientProperties
의 각 속성에 바인딩 됩니다.
그리고 이 속성 값들은 인가서버로 권한부여 요청을 하기 위한 ClientRegistration
필드에 저장됩니다.
따라서
ClientRegistration
을 참조해서 인가서버와 통신합니다.
순서:application yml
->OAuth2ClientProperties
->ClientRegistration
위 ClientRegistration
에 저장된 정보를 OAuth2Client
가 사용한다.
유명한 osp는 데이터를 적게 넣어도 되고 아니면 모든 정보를 다 기술해 주어야 한다.
security:
oauth2:
client:
registration:
github:
client-id:
client-secret:
redirect-uri:
scope:
- read
- user
google:
client-id:
client-secret:
scope:
- email
- profile
위는 유명한 google, github이라서 이렇게만 적어줘도 되는거고
naver, kakao 같은 경우 registration
말고 provider
설정도 추가해 줘야 한다.
위 yml에서 등록한 정보들은 OAuth2ClientProperties
에 들어가 지는데 필드로
provider
, registration
을 가지고 있는다. 이 둘은 위 yml과 일치하고 이를 map으로 가진다.
ClientRegistrationRepository
는 말 그대로 ClientRegistration
의 저장소 역할을 해줍니다.
위에서 보면 ClientRegistration
을 만든다고 했는데 이 객체들을 여러가지 만들수 있고 이런 애들을 저장한다. 기본 구현체는 InMemoryClientRegistrationRepository
이고 @Bean
으로 등록되기 때문에 주입받아 사용 가능하다.
application.yml
에서 설정 가능하고 다른 방법은 ClientRegistrationRepository
를 가져와서 직접 Java코드로 등록하는 방법도 있다.
조건식에 의해 참이면 그에 해당하는 설정 클래스를 가져온다. 가져온 클래스는 아래 2번이다.
해당 클래스 내부에는 3.클래스가 있고
해당 클래스는 아래 4.클래스를 로드한다.
결국 위 1, 2, 3은 아래 4번을 호출하기 위한 과정으로 보면 편하다.
clientRegistrationRepository
가 있다.OAuth2ClientWebMvcSecurityConfiguration
이 클래스가 가장 중요한데 그 이유는 OAuth2AuthorizedClient
를 관리하기 때문이다.
OAuth2AuthorizedClient
는 accessToken
, refreshToken
등 주요한 정보를 다 가지고 있다.
다음으로 자동설정이 하나 더 있는데 이는
이다.
두가지가 있는데 위쪽에 적어둔 OAuth2ClientRegistrationRepositoryConfiguration
이 있고 나머지는 OAuth2WebSecurityConfiguration
이다.
OAuth2WebSecurityConfiguration
는
1. InMemoryOAuth2AuthorizedClientService
로 Client를 조회, 저장, 삭제하고
2. AuthenticatedPrincipalOAuth2AuthorizedClientRepository
로 위임하는 역할이있다.
3. 마지막은 SecurityFilterChain으로 체인으로 등록해서 사용 가능하게 한다