JWT (JSON Web Token)
JWT는 호스트 사이에 데이터를 JSON 형태로 안전하게 전송하기 위한 Token이다.
JWS
IETF(국제 인터넷 표준화 기구)에서 제안한 임의의 데이터의 서명(signing)에 대한 표준이다.
JWT를 포함한 다양한 web 기반 기술에 사용된다.
Signing
Digital Signature란 digital message 또는 digital 문서가 진짜임(authenticity)을 확인하기 위한 수학적 방식(scheme)이다.
유효한 디지털 서명은 수신인에게 데이터에 대한 매우 높은 정도의 신뢰도(authenticity, integrity)를 보장한다.
- authenticity - 해당 데이터가 알고 있는(믿을 만한) sender로부터 생성되었음
- integrity - 메세지가 중간에 변형되지 않았음
디지털 서명은 public-key cryptography(또는 asymmetric cryptography) 방식을 채택하고 있다. 일반적으로 디지털 서명은 non-secure channel을 통해 전송되는 메세지들에 대한 검증과 보안을 제공한다.
대칭 키 암호화 (공개 키 암호화 방식)
사용자 X의 공개 키로 암호화 된 메세지는 사용자 X의 비공개 키로 복호화된다.
(암호화할때와 복호화할때의 키가 다르다)
JWT
JWT는 header, payload, signature 를 점(.)으로 연결한 문자열이다.
디지털 서명이 적용되어 있어 신뢰할 수 있다. URL에서만 사용할 수 있는 문자(Base64Url)열로만 구성되어 있어 HTTP 구성요소(헤더, 본문, url) 어디에든 위치할 수 있다.
header
두 가지 정보를 담고 있다.
{
"alg": "HS256",
"typ": "JWT"
}
alg
- Signature를 인코딩하는데 사용하는 해싱 알고리즘의 종류typ
- 토큰의 종류
payload
토큰의 본문이다. Payload에 포함된 속성들을 Claim이라고 한다. 클레임에는 크게 세 가지 종류가 있다.
- Registered claim - 선택적이다. 이름(키 값)이 이미 정해져 있는 클레임이다.
- Public claim - 사용자 마음대로 키 값을 정할 수 있다. 다만 중복되면 안된다.
- Private claim - 위의 두 가지를 제외한 나머지.
이렇게 생성된 header와 payload는 Base64Url 형식으로 인코딩된다.
signature
인코딩된 헤더(header)와 내용(payload), 비밀 키, 헤더의 alg값을 사용해 생성된다.
HMAC SHA 256 알고리즘을 사용해 서명을 생성한다면 다음과 같은 방식으로 서명이 생성된다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secretKey
)
secret key
- cryptographic operation에 사용되는 키 값은 항상 binary(byte arry) 형태로 전달되어야 한다.
- HMAC SHA 256을 선택했다면 key(byte array)는 256bits보다 길거나 같아야 한다.
서명은 토큰의 모든 값들을 포함하여 암호화 하기 때문에 메세지의 무결성을 확인할때 사용된다.
references
- 스프링 부트 핵심 가이드
- Wikipedia
- 3-2 알고리즘 강의 노트
Comments