Spring boot 에서 RSA JWT 적용해보기 (1) | 개요 및 검증
RSA JWT 적용하는 이유
모바일 앱으로부터 전달받은 JWT의 payload를 서버에서 사용해야 하는 상황이 발생했습니다.
이때 JWT는 HMAC 기반(HS256, HS384, HS512)으로 서명되어 있었고, 이를 검증하거나 payload를 신뢰하려면 secret key(대칭키)가 필요했습니다.
그러나 이 키는 외부에 노출되면 안 되기 때문에, 보안상 앱에서 전달받을 수 없는 구조였습니다.
결국 서버는 JWT를 검증하기 위해 JWT를 발급한 인증 서버에 검증 요청을 해야만 했습니다.
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를 신뢰할 수 있게 됩니다.
JWT Receiverd Server의 화살표가 조금 깨졌네요
서버에서 JWT의 Signature를 공개키로 검증하는 과정을 거치며, 이 과정을 통해 payload의 위변조 여부를 확인할 수 있습니다.
RS256 서명의 특징
RS256은 RSA 알고리즘을 기반으로 SHA-256 해시를 사용하여 서명합니다.
이 방식은:
- 인증 서버의 서명만 신뢰하면 되며
- 검증 서버는 공개키만 있으면 되기 때문에 확장성이 매우 뛰어납니다.
결과적으로 검증된 JWT payload를 다양한 서비스에서 신뢰하고 사용할 수 있게 됩니다.
HMAC JWT vs RSA JWT
항목 | RSA (RS256 등) | HMAC (HS256 등) |
🔒 보안성 | 공개키 노출 안전 → 공개 배포 가능 | Secret 노출 시 전체 보안 취약 |
🧩 확장성 | 다수의 서비스/검증자에 적합 (검증자만 공개키 필요) | 단일 서버 혹은 내부용 API 적합 |
🔁 키 회전 | 개인키 교체만 하면 검증자는 공개키만 갱신하면 됨 | 모든 시스템의 secret 동시 갱신 필요 |
📦 토큰 크기 | 공개키 기반이라 서명 길이 큼 (토큰 크기 ↑) | 상대적으로 작음 |
🛠️ 구현 난이도 | 키페어 관리 필요 | 비교적 단순 |
이번 글에서는 JWT의 기본 구조와 RSA 기반 검증 방식의 필요성과 장점을 소개했습니다.
다음 글에서는 Spring Boot 환경에서 RS256 기반 JWT를 직접 구현해보는 예제를 다루겠습니다.