IT IT 인터넷 Spring Security

http://java21.net/blog/marco?post_id=2433

Jwt Client Assertion Validation 커스터마이징

Jwt Client Assertion Validation 커스터마이징

기본 동작

Spring Authorization Server에서는 JwtClientAssertionDecoderFactory.DEFAULT_JWT_VALIDATOR_FACTORY를 통해 기본적인 OAuth2TokenValidator<Jwt>를 제공한다.


이를 통해 RegisteredClient 기준으로 다음과 같은 JWT Claim 들을 검증한다.

기본 Claim 검증 항목

  • iss (issuer, 발급자)

  • sub (subject, 사용자 식별자)

  • aud (audience, 대상)

  • exp (만료 시간)

  • nbf (not before, 활성화 시간)


JwtClientAssertionDecoderFactory 커스터마이징 이유

  • 기본 Claim 검증 외에 추가적인 Claim 검증이 필요한 경우 사용

  • 예를 들어, JWT 안에 존재하는 커스텀 Claim 값 검증 등

  • 비즈니스 요구사항에 따른 Claim 검증 로직 변경 필요 시 활용


구조 및 동작 방식

구성 요소

역할

JwtClientAssertionDecoderFactory

RegisteredClient에 따라 JwtDecoder를 생성

JwtClientAssertionAuthenticationProvider

위 Factory를 사용해 JWT Bearer 기반 Client 인증 처리


사용 예시

Custom Claim Validator 추가 예시

JwtClientAssertionDecoderFactory decoderFactory = new JwtClientAssertionDecoderFactory();

decoderFactory.setJwtValidatorFactory(registeredClient -> {
    OAuth2TokenValidator<Jwt> defaultValidator =
        JwtClientAssertionDecoderFactory.DEFAULT_JWT_VALIDATOR_FACTORY.apply(registeredClient);

    OAuth2TokenValidator<Jwt> customValidator = new DelegatingOAuth2TokenValidator<>(
        defaultValidator,
        new CustomClaimValidator() // 직접 구현한 Claim 검증 로직
    );

    return customValidator;
});

JwtClientAssertionAuthenticationProvider provider =
    new JwtClientAssertionAuthenticationProvider(registeredClientRepository);

provider.setJwtDecoderFactory(decoderFactory);

CustomClaimValidator 예시

public class CustomClaimValidator implements OAuth2TokenValidator<Jwt> {
    @Override
    public OAuth2TokenValidatorResult validate(Jwt jwt) {
        if (!jwt.containsClaim("custom-claim")) {
            OAuth2Error error = new OAuth2Error("invalid_token", "Missing custom-claim", null);
            return OAuth2TokenValidatorResult.failure(error);
        }
        return OAuth2TokenValidatorResult.success();
    }
}

정리

사용 목적

설명

기본 검증

iss, sub, aud, exp, nbf Claim 자동 검증

커스터마이징 검증

CustomClaimValidator 로 추가 Claim 검증

확장 방식

JwtClientAssertionDecoderFactory의 setJwtValidatorFactory() 이용