Spring/Spring Security

[Spring Authorization Server] 2. Core Model / Components

noahkim_ 2025. 7. 24. 09:35

1. RegisteredClient

  • 인가 서버에서 등록된 클라이언트 정보를 나타내는 객체

 

표) 주요 속성

더보기
필드 설명
id
내부 시스템에서 고유하게 식별되는 UUID
 
clientId
외부 클라이언트가 사용하는 고유 식별자
client-a
clientSecret
클라이언트 비밀번호. PasswordEncoder로 인코딩된 값
 
clientAuthenticationMethods
클라이언트 인증 방식
client_secret_basic
private_key_jwt 
authorizationGrantTypes
클라이언트가 사용할 수 있는 grant type 목록
refresh_token
token_exchange
redirectUris
authorization_code flow에서 사용할 redirect URI
 
postLogoutRedirectUris
OIDC 로그아웃 이후 리디렉션될 URI
 
scopes
요청 가능한 권한 범위
"read"
"write"
clientSettings
클라이언트 관련 설정
consent 필요 여부
PKCE 사용 여부
tokenSettings
토큰 수명, refresh token 재사용 여부 등
 

 

표) 인증 방식 지원 목록 (clientAuthenticationMethods)

더보기
인증 방식 설명
client_secret_basic
Authorization 헤더 사용 (기본 방식)
client_secret_post
POST 본문에 client_id, client_secret 전달
private_key_jwt
클라이언트가 private key로 서명한 JWT 전송
client_secret_jwt secret으로 서명한 JWT 전송
none public client (인증 없음)

 

표) Grant Type 지원 목록 (authorizationGrantTypes)

더보기
Grant Type 설명
authorization_code 사용자 인증을 포함한 표준 흐름
client_credentials 클라이언트 자체 인증 (user 없음)
refresh_token 기존 토큰 갱신
urn:ietf:params:oauth:grant-type:device_code 디바이스 코드 기반 인증 (TV 등)
urn:ietf:params:oauth:grant-type:token-exchange
토큰 교환 (다른 토큰으로 새로운 토큰 발급)

 

2. RegisteredClientRepository

  • 인가 서버에 등록된 클라이언트 정보를 저장하고 조회하는 저장소

 

필요한 상황
  • 클라이언트 인증
  • grant_type 요청
  • token introspection
  • 동적 클라이언트 등록

 

3. OAuth2Authorization

  • 인가 서버에서 인가된 상태의 클라이언트를 저장하는 객체 (모든 토큰 정보와 상태)
  • 클라이언트가 인가 플로우를 성공적으로 완료했을 떄 생성됨

 

표) 주요 속성

더보기
필드 설명
id
이 Authorization 객체의 고유 식별자
registeredClientId
어떤 클라이언트에게 발급된 것인지 식별 (RegisteredClient ID)
principalName
인증된 사용자 이름 (혹은 client_credentials일 경우 클라이언트 ID)
authorizationGrantType
어떤 grant type으로 발급되었는지 (authorization_code, client_credentials, 등)
authorizedScopes 부여된 scope 목록
tokens
이 authorization에 연관된 token 객체들 (access token, refresh token 등)
attributes
인증 요청 또는 grant type에 따른 부가 정보 (예: OAuth2AuthorizationRequest, 사용자 정보 등)

 

4. OAuth2AuthorizationService

  • OAuth2Authorization를 저장/조회/삭제하는 서비스

 

5. OAuth2AuthorizationConsent

6. OAuth2AuthorizationConsentService

7. OAuth2TokenContext

  • OAuth2 토큰 생성 및 커스터마이징 시 필요한 정보를 담고 있는 컨텍스트 객체
  • OAuth2TokenGenerator나 OAuth2TokenCustomizer에서 사용됨

 

8. OAuth2TokenGenerator

  • OAuth2TokenContext의 정보를 바탕으로 OAuth2 토큰을 생성하는 컴포넌트

 

설정

  • 토큰 구현체: OAuth2TokenContext.getTokenType()
  • Access Token 형식: RegisteredClient.getTokenSettings().getAccessTokenFormat()

 

표) 토큰 클래스

더보기
OAuth2TokenType 값 생성되는 토큰 클래스
code OAuth2AuthorizationCode
access_token OAuth2AccessToken
refresh_token OAuth2RefreshToken
id_token (OIDC) OidcIdToken

 

표) Access Token 형식

더보기
설정값 생성 방식 생성자 클래스
SELF_CONTAINED (기본값) JWT (키+클레임 전달) JwtGenerator
REFERENCE Opaque (키만 전달. 클레임은 서버에 저장됨) OAuth2AccessTokenGenerator

 

9. OAuth2TokenCustomizer

  • 토큰이 생성되기 직전에 토큰의 claim 또는 header를 커스터마이징할 수 있게 해주는 인터페이스
  • OAuth2TokenGenerator 내부에서 호출됨

 

설정) OAuth2TokenCustomizer

더보기
@Bean
public OAuth2TokenCustomizer<JwtEncodingContext> jwtCustomizer() {
    return context -> {
        JwsHeader.Builder headers = context.getJwsHeader();
        JwtClaimsSet.Builder claims = context.getClaims();
        if (context.getTokenType().equals(OAuth2TokenType.ACCESS_TOKEN)) {
            // Customize headers/claims for access_token

        } else if (context.getTokenType().getValue().equals(OidcParameterNames.ID_TOKEN)) {
            // Customize headers/claims for id_token

        }
    };
}

 

10. SessionRegistry

 

 

출처