Nimbus-jose-jwt로 JWS 검증하기

고범수·2023년 8월 2일
3

Spring Boot

목록 보기
7/12

현재 상황

아래 글과 이어진다.

https://velog.io/@rhqjatn2398/Signature-%EA%B2%80%EC%A6%9D-%EC%97%86%EC%9D%B4-JWT-%ED%8C%8C%EC%8B%B1%ED%95%98%EA%B8%B0

Open ID Connect에서의 ID Token을 검증하는데 Nimbus-jose-jwt 라이브러리를 사용하기로 하였다. ID Token은 JWT(JWS)이며 토큰의 header에 kid, alg 정보가 담겨있다. 또한, RSA 알고리즘으로 서명이 되어있다. 즉, ID Token을 발급한 측(Issuer)의 private key로 ID Token의 header.payload를 암호화하여 서명했다는 뜻이다. 따라서 이 ID Token이 유효한지(위조되지 않았는지)검증하려면 해당하는 private key에 대응되는 public key 정보가 필요하다.

private key에 대응되는 public key는 ID Token을 발급한 측이 제공할 것이다. Google Open ID Connect의 경우에는 아래 위치에서 얻을 수 있다.

https://accounts.google.com/.well-known/openid-configuration



주어지는 public key는 JWK(Json Web Key)를 나타내는 Json data이다. 이에 대한 설명은 아래 링크에 자세히 나와있다.


https://datatracker.ietf.org/doc/html/rfc7517


https://auth0.com/docs/secure/tokens/json-web-tokens/json-web-key-sets


간단히 설명하면, 비대칭키 방식인 RSA로 서명된 JWT(JWS)는 서명할 때 사용된 private key와 쌍을 이루는 public key를 이용하여 검증을 수행해야 한다. 이 때, public key 정보를 Json Token 형식으로 나타낸 것이 Json Web Key(JWK)인 것이다.

JWK의 형태는 다음과 같다. (RFC7517에서 제시된 샘플 데이터)

흥미로운 점은 public key가 두 개라는 점이다. 따라서, public key와 ID Token의 kid(Key ID) 값을 비교해 일치하는 public key로 검증해야한다.

과정


위와 같이 검증절차를 진행할 수 있다. 매개변수인 jwkStr에 public keys를 String 데이터 형식으로 담긴다. Nimbus-jose-jwt 라이브러리에서는 String 형식의 public keys를 파싱하여 JWKSet을 얻을 수 있다.

또한 JWKSelector 클래스에서 두 개의 JWK 중에서 어느 것을 사용하여 검증해야 할 지 선택하는 작업을 수행해준다. 이 때, 생성자에 검증할 토큰(ID Token)의 헤더 정보를 넘겨준다. (헤더에 alg, kid 정보가 담겨있기 때문)

마지막으로, toRSAKey().toPublicKey()를 통해 선택된 JWK에서 공개키를 구성하고 ID Token을 검증하면 서명을 검증할 수 있다.

참고

RSA 알고리즘은 대표적인 공개키 암호방식(비대칭키)이다.

0개의 댓글