JOSE 및 JWT 표준 가이드: RFC 7515부터 7519까지
최신 웹 인증을 구현해 본 적이 있다면 JSON Web Token (JWT)을 사용해 보셨을 것입니다. 하지만 JWT는 **JOSE (JSON Object Signing and Encryption)**라고 불리는 더 큰 표준 제품군의 한 조각일 뿐입니다. 이러한 표준 간의 관계를 이해하는 것은 보안 응용 프로그램을 구축하는 데 필수적입니다.
이 가이드에서는 JOSE 스택을 구성하는 5가지 핵심 RFC를 살펴보겠습니다.
- RFC 7515: JWS (JSON Web Signature)
- RFC 7516: JWE (JSON Web Encryption)
- RFC 7517: JWK (JSON Web Key)
- RFC 7518: JWA (JSON Web Algorithms)
- RFC 7519: JWT (JSON Web Token)
1. RFC 7515: JSON Web Signature (JWS)
JWS는 JWT의 가장 일반적인 형태입니다. 토큰의 내용이 변조되지 않았음을 보장합니다. 무결성과 인증성을 제공하지만 기밀성은 제공하지 않습니다(내용은 토큰을 보는 모든 사람에게 보입니다).
구조:
JWS는 일반적으로 마침표로 구분된 세 부분으로 구성된 Compact Serialization 형식으로 표시됩니다.
BASE64URL(Header) . BASE64URL(Payload) . BASE64URL(Signature)
- Header: 서명에 사용된 알고리즘을 지정합니다(예:
{"alg": "HS256"}). - Payload: 실제 서명되는 데이터입니다.
- Signature: 헤더와 페이로드를 서명한 결과입니다.
2. RFC 7516: JSON Web Encryption (JWE)
JWS가 무결성을 제공하는 반면, JWE는 기밀성을 제공합니다. 의도된 수신자만 읽을 수 있도록 페이로드를 암호화합니다.
구조:
JWE Compact Serialization은 다섯 부분으로 구성됩니다.
BASE64URL(Header) . BASE64URL(Encrypted Key) . BASE64URL(Initialization Vector) . BASE64URL(Ciphertext) . BASE64URL(Authentication Tag)
JWE는 토큰에 PII(개인 식별 정보)와 같이 클라이언트나 중간 프록시에 노출되어서는 안 되는 민감한 정보가 포함되어 있을 때 주로 사용됩니다.
3. RFC 7517: JSON Web Key (JWK)
JWK는 암호화 키를 나타내는 JSON 데이터 구조입니다. 서버 간에 공개 키를 표준화된 방식으로 공유하는 데 사용됩니다.
예시:
{
"kty": "RSA",
"use": "sig",
"kid": "1b94c",
"n": "vXl...",
"e": "AQAB"
}
JWK의 집합을 **JWKS (JSON Web Key Set)**라고 하며, 주로 /.well-known/jwks.json과 같은 엔드포인트에서 찾을 수 있습니다.
4. RFC 7518: JSON Web Algorithms (JWA)
JWA는 JOSE 스택의 "사전"입니다. 서명(JWS) 및 암호화(JWE)에 사용되는 특정 알고리즘을 정의합니다.
일반적인 알고리즘:
- HS256: SHA-256을 사용하는 HMAC (대칭키).
- RS256: SHA-256을 사용하는 RSASSA-PKCS1-v1_5 (비대칭키).
- ES256: P-256 및 SHA-256을 사용하는 ECDSA (비대칭키).
- A128GCM: 128비트 키를 사용하는 AES GCM (암호화).
5. RFC 7519: JSON Web Token (JWT)
JWT는 페이로드가 Claims (클레임) 집합인 JWS 또는 JWE의 응용입니다. 클레임은 엔티티(주로 사용자)에 대한 정보 조각입니다.
표준 클레임:
iss: 발행자 (Issuer)sub: 대상 (Subject, 주로 사용자 ID)aud: 대상자 (Audience)exp: 만료 시간 (Expiration Time)iat: 발행 시간 (Issued At)
요약 비교
| 표준 | 목적 | 비유 |
|---|---|---|
| JWS | 무결성 | 서명된 편지 |
| JWE | 기밀성 | 암호화된 봉투 |
| JWK | 키 표현 | 공개 키 파일 |
| JWA | 알고리즘 카탈로그 | 암호 목록 |
| JWT | 데이터 형식 | 토큰 자체 |
자주 묻는 질문 FAQ
Q: JWT는 항상 JWS인가요? A: 항상 그런 것은 아니지만 99%의 경우 그렇습니다. JWT는 JWS(서명됨), JWE(암호화됨) 또는 서명 없는 JWT일 수 있습니다.
Q: RS256과 HS256 중 무엇을 사용해야 하나요? A: 일반적으로 ID 토큰에는 RS256(비대칭)이 선호됩니다. 클라이언트가 서명에 사용된 개인 키 없이도 서명을 검증할 수 있기 때문입니다. HS256(대칭)이 더 빠르지만 비밀 키 공유가 필요합니다.
Q: JWT 내부를 어디서 볼 수 있나요? A: JWS 페이로드는 Base64로 인코딩되어 있을 뿐이므로 쉽게 디코딩할 수 있습니다. 하지만 서명을 검증하기 전까지는 데이터를 신뢰해서는 안 됩니다.