Spring Security ‐ OAuth 2.0 MAC & RSA 토큰 검증 - dnwls16071/Backend_Summary GitHub Wiki

  • 암호화 알고리즘 방식에 따라 직접 발행한 JWT 토큰을 대상으로 검증을 진행한다.
  • 인가 서버에서 발행한 Access Token을 대상으로 검증을 진행한다.
  • JwtDecoder 빈은 암호화 알고리즘 및 특정한 조건에 따라 각 생성되며 디코딩이 진행되면 주어진 알고리즘에 의해 검증하게 된다.

📚 MAC 검증 기능(JwtDecoder에 의한 검증)

  • JwtAuthorizationMacFilter : Bearer 토큰을 MAC 알고리즘에 의해 검증하며 검증 성공시 인증 및 인가를 처리하는 필터
  • MacSecuritySigner : MAC 기반 서명 및 토큰을 발행하는 클래스

📚 RSA 검증 기능(JwtAuthorizationRsaFilter에 의한 검증)

  • SecretKey 기반 JwtDecoder 생성
  • 대칭키 방식으로 생성된 토큰을 검증하기 위해 JWK를 상속한 OctetSequenceKey로 SecretKey 기반 JwtDecoder를 생성한다.
@Bean
@ConditionalOnProperty(prefix = "spring.security.oauth2.resourceserver.jwt", name = "jws-algorithms", havingValue = "HS256", matchIfMissing = false)
public JwtDecoder jwtDecoderBySecretKeyValue(OctetSequenceKey octetSequenceKey,OAuth2ResourceServerProperties properties) {
    return NimbusJwtDecoder.withSecretKey(octetSequenceKey.toSecretKey())
                           .macAlgorithm(MacAlgorithm.from(properties.getJwt().getJwsAlgorithms().get(0)))
                           .build();
}
spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jws-algorithms: HS256

📚 RSA 검증 기능(PublicKey.txt에 의한 검증)

  • Java는 KeyStore라는 인터페이스를 통해 암호화/복호화 맟 전자 서명에 사용되는 Private Key, Public Key와 Certificate를 추상화하여 제공하고 있다.
  • KeyStore에는 Secret Key, Private Key, Public Key, Certificate와 같은 보안 파일들이 저장되며 KeyStore에는 파일 시스템에 저장하고 암호로 보호할 수 있다.
  • KeyStore에는 keytool을 사용해서 생성할 수 있으며 기본 타입은 jks이다.

keytool

  • keytool은 자바에서 제공하는 유틸리티로 KeyStore 기반으로 인증서와 키를 관리할 수 있으며 JDK에 포함되어 있다.
  • Keystore 생성 후 PrivateKey, PublicKey, Certificate 생성
    • Private key 생성 : keytool -genkeypair -alias apiKey -keyalg RSA -keypass "pass1234" -keystore apiKey.jks -storepass "pass1234"
    • Certificate 생성 : keytool -export -alias apiKey -keystore apiKey.jks -rfc -file trustServer.cer
    • Public key 생성 : keytool -import -alias trustServer -file trustServer.cer -keystore publicKey.jks

📚 BearerTokenAuthenticationFilter 검증 아키텍처