JOSE
개발을 하다 보면 JWT를 마주칠 때가 있다.
JOSE는 JWT가 속한 프레임워크라고 할 수 있는데 오늘은 JOSE에 대해서 자세히 살펴보고자 한다.
JOSE는 JSONObject Signing and Encryption의 약자로 쉽게 설명하면 JSON을 암호화했다는 내용이다.
JOSE는 당사자 간에 claim을 안전하게 전송하기 위한 프레임워크
(Claim : Key/value 쌍의 client 메타 정보)
JOSE 프레임워크 규격
JOSE 안에는 JWT 뿐만 아니라 다른 스펙들도 존재한다.
JWT, JWS, JWE, JWK 4가지의 스펙이 존재하는데 모두 JOSE 프레임워크 안에 속하게 된다.
JWT(JSON Web Token) : JWS or JWE
JWS(JSON Web Signature)
JWE(JSON Web Encryption)
JWK(JSON Web Key)
JWT는 JWS or JWE라고 되어 있는데 둘 다 될 수 있기 때문이다.
자바 개발자 혹은 객체지향 개발자라면 인터페이스라고 생각하는 것이 이해하기 쉬울 것이다.
JWS
JSON으로 전자 서명하여 데이터의 무결성을 확인하고 출처를 인증 방식
Header : 헤더는 서명에 사용할 알고리즘과 토큰의 타입을 지정
{
"alg": "HS256",
"typ": "JWT
}
Payload : 실제 데이터
{
"sub" : "1234567890",
"name": "Jone Doe",
"iat": 1516239022
}
Signature : 서명은 헤더와 페이로드를 인코딩한 후, 지정된 알고리즘을 사용하여 생성
이 서명을 통해 데이터의 무결성과 출처를 확인할 수 있다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
JWT 생성 과정
- 헤더 인코딩 : 헤더 JSON 객체를 Base64로 인코딩
- 페이로드 인코딩 : 페이로드 JSON 객체를 Base64로 인코딩
- 서명 생성 : 인코딩된 헤더와 페이로드를 점(`.`)으로 연결한 후, 이를 지정된 알고리즘과 비밀키(또는 공개/개인 키쌍)을 사용하여 서명
- JWS 생성 : 인코딩된 헤더, 페이로드, 서명을 점(`.`)으로 연결하여 최종 JWS를 생성
<Base64Url-encoed header>.<Base64Url-encoed payload>.<signature>
JWE
JSON을 암호화하여 데이터를 안전하게 전송시키지 위한 표준
Header : 헤더는 암호화 사용되는 알고리즘과 키 관리 방식, 토큰 타입 등을 지정
{
"alg": "RSA-OAEP", // 키 관리 알고리즘
"enc": "A256GCM", //콘텐츠 암호화 알고리즘
"typ": "JWT"
}
Encrypted Key(암호화된 키) : 콘텐츠 암호화에 사용되는 대칭 키를 헤더에서 지정된 알고리즘으로 암호화한 값
Initialzation Vector(IV) : 블록 암호화 알고리즘에서 사용되는 초기화 벡터
Ciphertext(암호문) : 실제 암호화된 페이로드 데이터
Authentication Tag(인증 태그) : 암호화된 데이터를 무결성을 검증하기 위한 태그
JWE 생성 과정
- 헤더 인코딩 : 헤더 JSON 객체를 Base64Url 인코딩 한다.
- 대칭 키 생성 : 콘텐츠 암호화에 사용할 대칭 키를 생성
- 대칭 키 암호화 : 생성된 대칭 키를 공개 키 암호화 알고리즘을 사용하여 암호화
- 초키화 백터 생성 : 블록 암호화 알고리즘을 사용할 IV를 생성
- 페이로드 암호화 : 대칭 키와 IV를 사용하여 페이로드를 암호화
- 인증 태그 생성 : 암호화된 데이터에 대한 무결성을 검증할 수 있는 인증 태그 생성
- JWE생성 : 인코딩 된 헤더, 암호화된 키, IV, 암호문, 인증 태그를 점(`.`)으로 연결하여 최종 JWE생성
<Base64Url-encoded header>.<Base64Url-encoded encrypted key>.<Base64Url-encoed initialization vector>.<Base64Url-encoded ciphertext>.<Base64Url-encoded authentication tag>
JWK
JSON 형식으로 암호화 키를 표현하는 표준
JWT가 공개키, 비밀키로 암호화되었을 때 공개키를 여러 사용자에게 오픈을 해야 하기 때문에 서버는 JWK로 공개키를 조회할 수 있도록 한다.
Spring Authorization Server에서는 /oauth2/jwks를 호출하면 조회할 수 있도록 설정을 할 수 있다.
- kty: 키 타입 (예: RSA, EC)
- use: 키의 용도 (예: sig는 서명, enc는 암호화)
- alg: 키에 사용되는 알고리즘 (예: RS256, ES256)
- kid: 키 식별자, 특정 키를 식별하는 데 사용
- n: RSA 공개 키의 모듈러스
- e: RSA 공개 키의 지수
- d: RSA 비밀 키의 지수 (비밀 키에만 존재)
- x: ECC 공개 키의 x 좌표
- y: ECC 공개 키의 y 좌표
- crv: ECC 키의 곡선 (예: P-256, P-384)
{
"kty": "RSA",
"use": "sig",
"alg": "RS256",
"kid": "1b94c",
"n": "0vx7agoebGcQSuuPiLJXZptNCo7Z_jyqC6f9kmG5A4oaV0mtSYLQBrU0r7TldUIfrIkgzMSbIH6k3z3J7kx2xQZXS6Jp1ENFOqi5F7b0R8mbTg3B9x24Ut1G8o36XeX2OJ4hRGV5lMnrrt8xLz90nPHZMtM3XbI5S2DBIVvS9_Qf2n3QLq74vjcE7YoB18I4Fu7Z-2U5VR5ol1S-9PPL5yVnGAKPwHtFZ9l5M4zNnJL0OKk",
"e": "AQAB"
}
긴 글 읽어주셔서 감사합니다.
'CS' 카테고리의 다른 글
[CS] CORS는 무엇일까? (0) | 2024.12.26 |
---|---|
[CS] Test Double (0) | 2024.12.19 |
[OAUTH] OAuth 2.1 (2) | 2024.12.14 |
[CS] 개발 표기법 정리 (0) | 2020.09.02 |
[CS] Server & Client (0) | 2020.08.13 |