SpringBoot

Spring boot 에서 RSA JWT 적용해보기 (1) | 개요 및 검증

pepega 2025. 6. 21. 07:44

RSA JWT 적용하는 이유

모바일 앱으로부터 전달받은 JWT의 payload를 서버에서 사용해야 하는 상황이 발생했습니다.

이때 JWT는 HMAC 기반(HS256, HS384, HS512)으로 서명되어 있었고, 이를 검증하거나 payload를 신뢰하려면 secret key(대칭키)가 필요했습니다.

그러나 이 키는 외부에 노출되면 안 되기 때문에, 보안상 앱에서 전달받을 수 없는 구조였습니다.

결국 서버는 JWT를 검증하기 위해 JWT를 발급한 인증 서버에 검증 요청을 해야만 했습니다.

JWT Signature 못한 경우

 

HMAC JWT 방식의 한계

이 구조도 가능하긴 하지만, 다음과 같은 단점이 있습니다:

  • JWT Issuer는 토큰을 발급할 뿐 아니라 검증 요청도 매번 처리해야 합니다.
  • 따라서 JWT Issuer의 부하가 증가할 수 있으며, 서비스 확장 시 병목 지점이 될 수 있습니다.

 

RSA 방식의 장점

이러한 상황에서 RSA와 같은 비대칭 키 기반 서명 방식을 사용하면, Issuer가 매번 검증을 수행하지 않아도 됩니다.
Issuer는 개인키로 JWT를 서명하고, 검증자는 공개키로 서명을 검증함으로써 payload의 무결성을 보장할 수 있습니다.

 

 

JWT 사양에서도 비대칭 키 알고리즘(RS256, ES256 등)을 예시로 제시하고 있으며, RSA 방식은 보안성과 확장성 측면에서 좋은 선택이 될 수 있습니다. 추가적인 비용이 드는 것도 아니므로, 초기 설계 시 고려해볼 만합니다.

 

RSA JWT 사용해보기

RSA는 비대칭 키 기반의 알고리즘으로, 발급 서버는 개인키(private key)를, 검증자는 공개키(public key)를 사용합니다.

JWT를 전달받은 후, 공개키를 통해 JWT의 서명을 검증하면 payload를 신뢰할 수 있게 됩니다.

RSA JWT Signature 과정

JWT Receiverd Server의 화살표가 조금 깨졌네요

서버에서 JWT의 Signature를 공개키로 검증하는 과정을 거치며, 이 과정을 통해 payload의 위변조 여부를 확인할 수 있습니다.

 

 

RS256 서명의 특징

RS256은 RSA 알고리즘을 기반으로 SHA-256 해시를 사용하여 서명합니다.

RS256 JWT Siganature

이 방식은:

  • 인증 서버의 서명만 신뢰하면 되며
  • 검증 서버는 공개키만 있으면 되기 때문에 확장성이 매우 뛰어납니다.

결과적으로 검증된 JWT payload를 다양한 서비스에서 신뢰하고 사용할 수 있게 됩니다.

 

 

HMAC JWT vs RSA JWT

항목 RSA (RS256 등) HMAC (HS256 등)
🔒 보안성 공개키 노출 안전 → 공개 배포 가능 Secret 노출 시 전체 보안 취약
🧩 확장성 다수의 서비스/검증자에 적합 (검증자만 공개키 필요) 단일 서버 혹은 내부용 API 적합
🔁 키 회전 개인키 교체만 하면 검증자는 공개키만 갱신하면 됨 모든 시스템의 secret 동시 갱신 필요
📦 토큰 크기 공개키 기반이라 서명 길이 큼 (토큰 크기 ↑) 상대적으로 작음
🛠️ 구현 난이도 키페어 관리 필요 비교적 단순

 

 

 

이번 글에서는 JWT의 기본 구조와 RSA 기반 검증 방식의 필요성과 장점을 소개했습니다.
다음 글에서는 Spring Boot 환경에서 RS256 기반 JWT를 직접 구현해보는 예제를 다루겠습니다.