Spring Authorization Server - 주요 클래스
OAuth2Authorization
리소스 소유자의 역할이 있는 권한 부여 방식(
authorization_code,resource_owner_password,client_credentails)인 경우 클라이언트에 부여된 권한 부여, 즉 인가 상태를 유지하는 클래스Spring Security 의 OAuth2 Client 모델 OAuth2AuthorizedClient와 서로 대응하는 개념이다.
권한 부여 흐름이 성공적으로 완료되면
OAuth2Authorization이 생성되고AccessToken이 저장되며 선택적으로RefreshToken,IDToken등이 저장된다.생성된
OAuth2Authorization은OAuth2AuthorizationService에 의해 메모리나 DB에 저장된다.OAuth2Authorization에 저장되는OAuth2Token타입들은 권한 부여 유형 및scope에 따라 다르다.authorization_code의 경우OAuth2AuthorizationCode
OAuth2AccessToken
OAuth2RefreshToken(Optional)
OpenID Connect 1.0의 경우OAuth2AuthorizationCode
OidcIdToken
OAuth2AccessToken
OAuth2RefreshToken(Optional)
Client_Credentials의 경우OAuth2AccessToken

id :
OAuth2Authorization을 고유하게 식별하는 IDregisteredClientId :
RegisteredClient를 고유하게 식별하는 IDprincipalName : 리소스 소유자(또는 클라이언트)의 주체 이름
authorizationGrantType : 사용된 권한 부여 유형
authorizedScopes : 클라이언트에 대해 승인된 범위
tokens : 실행된 인가 유형에 특정한 OAuth2Token 인스턴스
attributes : 실행된 권한 부여 유형과 관련된 추가 속성
Token은 OAuth2Authorization의 내부 클래스로 있다.

각
OAuth2Token은 OAuth2Authorization.Token 에 속한다.OAuth2Authorization.Token은
isExpired(),isInvalidated(),isActive()에 대한 접근자를 제공한다.OAuth2Authorization.Token은
OAuth2Token과 관련된 클레임이 있는 경우getClaims()를 제공한다.
OAuth2AuthorizationService
OAuth2AuthorizationService는 새로운OAuth2Authorization을 저장하고 기존OAuth2Authorization을 검색하는 구성 요소이다.특정 엔드포인트 프로토콜 흐름을 따를 때 다른 구성 요소에서 사용된다.(클라이언트 인증, 권한 부여 처리, 토큰 검사, 토큰 취소, 동적 클라이언트 등록 등)
OAuth2AuthorizationService의 기본 구현체로는InMemoryOAuth2AuthorizationService와JdbcOAuth2AuthorizationService가 있다.OAuth2AuthorizationService구성은 선택 사항이며, 디폴트는InMemoryOAuth2AuthorizationService이다.

동작 흐름
여기서 Submit Consent 버튼을 클릭하면 인가 서버에서 보낸 임시 코드를 확인할 수 있다. 이때 인가 서버가 임시 코드를 보내기 전에 어떤 처리를 먼저 하는지 살펴보자.

요청을 처리하는 프로바이더의 내부 코드를 보면 임시 코드를 저장하는 클래스인 OAuth2AuthorizationCode를 생성해 OAuth2Authorization에 저장하는 것을 확인할 수 있다.

저장하는 이유
클라이언트는 액세스 토큰을 요청하기 위해 임시 코드를 다시 인가 서버에게 요청할 것이다.
인가 서버는 요청으로 온 임시 코드와 저장되어 있는 임시 코드 중에 같은 정보가 저장되어 있는
OAuth2Authorization를 찾아야 한다.클라이언트와 인가 서버 간의 상호 작용이 이루어지도록 인가 서버는 이런 정보들을 지속적으로 저장하여 계속 참조할 수 있게 된다.
해당 클라이언트는 한번 접속해서 임시 코드를 저장했다는 상태를 유지하는 것이다.
임시 코드로 액세스 토큰 요청

그러면 아래와 같이 code 파라미터 값으로 OAuth2AuthorizationService에서 OAuth2Authorization을 찾는다.

authorizationBuilder에다가 권한 부여 유형에 따라 알맞은 OAuth2Token을 저장시켜 최종 build()를 하여 OAuth2Authorization를 저장시킨다.
이 과정에서 invalidate() 에서 영어 설명처럼 authorization_code, 임시 코드는 한 번만 사용할 수 있으므로 무효화 시킨다.



만약 여기서 동일한 클라이언트 정보로 다시 액세스 토큰 요청을 한다면?

메모리로 저장하고 있어 계속해서 상태 정보가 쌓이고만 있다. 때문에 실제 운영 환경에서는 DB를 사용해야 한다.
토큰을 사용하여 현재 인가 상태 응답하기
OAuth2AuthorizationService 빈 등록 후 요청



이전 ↩️ - Spring Authorization Server - 주요 클래스(RegisteredClient)
Last updated