jwt 에 대해 간단히 알아보자.
Intro
- Json Web Token 에 대해서 간단히 알아보자. 기본적인 암호화 방식 및 기타 잡다한 정보는 나중에도 알고 있겠거니 하고.
- jws 는 JWS(json web signature)와 JWE(json web encryption)로 서명과 암호화 한 것.
jwt 구조
- 3가지 파트로 나뉘며 각 파트는 .(점) 으로 구분이 된다.
- Header, Payload, Signature 로 구성된다.
- ex. aaa.bbb.ccc
- Header
- 2가지 정보를 지닌다.
- alg : 암호화(해싱) 알고리즘 명시
- HS256(HMAC SHA-256), HS512, RS256(RSASSA SHA-256), ES256 등
- typ : 토큰 타입을 명시
- alg : 암호화(해싱) 알고리즘 명시
- 2가지 정보를 지닌다.
- Payload
- 토큰에 넣을 정보가 들어있다. key-value의 한 쌍으로 이루어진 클레임(claim)으로 불리는 것들로 이루어져있다.
- 저장되는 정보에 따라 등록된 클레임, 공개 클레임, 비공개 클레임으로 구분됨.
- Signature
- 시그니처의 구조는 헤더 + 페이로드 와 서버가 가지고 있는 유일한 키 값을 합친 것을 헤더에서 정의한 알고리즘으로 암호화 한다.
- 변조가 되었는지 확인하는 역할
- signature = Base64Url(Header) + . + Base64Url(PayLoad) + server’s key
- 시그니처의 구조는 헤더 + 페이로드 와 서버가 가지고 있는 유일한 키 값을 합친 것을 헤더에서 정의한 알고리즘으로 암호화 한다.
JWT 정보 확인하기
- https://jwt.io/ 를 통해서 확인해보자
- 예시의 데이터는 아래와 같다
- secret key 로 test-secret-key 를 사용하였다.
// Encoded 된 데이터
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.JCNAMz0AsT31lKxaGO4R8n9PpZ6ry9ZkWUcS5e3OtP4
// Decoded 된 데이터
// HEADER:ALGORITHM & TOKEN TYPE
{
"alg": "HS256",
"typ": "JWT"
}
// PAYLOAD:DATA
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
// VERIFY SIGNATURE
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
"test-secret-key"
)
// HEADER 데이터는 {"alg":"HS256","typ":"JWT"} 를 https://www.base64encode.org/ 에서 BASE64 Encode하면 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 나오는 것을 볼수 있을 것이다.
// 마찬가지로 PAYLOAD 의 데이터인 {"sub":"1234567890","name":"John Doe","iat":1516239022} 를 BASE64 로 Encode 하면 eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ 를 볼 수 있을 것이다.
// 마지막으로 서명 부분을 확인해 보자.
// 위에서 header 와 payload 를 BASE64 인코딩한 데이터가 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ 인데 이 데이터를 헤더에 명시한 alg 인 HS256으로 해시하면 된다.
// https://www.devglan.com/online-tools/hmac-sha256-online 이 사이트나 https://www.javainuse.com/hmac 에서 Secret Key 로 test-secret-key 를 넣고 Base64 포맷으로 Hash 하면
// JCNAMz0AsT31lKxaGO4R8n9PpZ6ry9ZkWUcS5e3OtP4= 이 나오는 것을 볼 수 있을 것이다.
참고
- https://velog.io/@egoavara/series/JWK-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%A0%9C%EC%9E%91%EA%B8%B0
- RFC7519
- https://datatracker.ietf.org/doc/html/rfc7519
- RFC7515
- https://datatracker.ietf.org/doc/html/rfc7515
- RFC7516
- https://datatracker.ietf.org/doc/html/rfc7516
- https://www.devglan.com/online-tools/hmac-sha256-online
- https://www.javainuse.com/hmac