Json Web Token


Json Web Token 이란

Json Web Token은 웹표준 (RFC 7519)에 포함되는 기술로 JSON 형태로 정보를 전달하는데 사용됩니다.


Json Web Token의 형태

기본적인 형태

{base64 encoded header}.{base64 encoded payload}.{base64 encoded verify signature}
JWT는 header, payload, verify signature가 .로 구분되어 연결된 String이다.

예시

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIwMDEiLCJuYW1lIjoiU29vbiBZb25nIiwiaWF0IjoxNTE2MjM5MDIyfQ.PBnQxnoLroVbIYI-egDMX4_74JxlhSgP2dPrFaKO2rE

예시 (base64 decoded)

{
  "alg": "HS256",
  "typ": "JWT"
}.
{
  "sub": "001",
  "name": "Soon Yong",
  "iat": 1516239022
}.
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  your-256-bit-secret
)

Json Web Token의 내부 정보

  • alg - verify signature에 사용된는 암호화 알고리즘
  • typ - Json Web Token의 경우 JWT의 값만 가진다.

payload

어플리케이션에서 사용할 정보를 담는다.

verify signature

header의 alg에 명시된 알고리즘으로 미리 정한 secret key를 이용하여 {base64 encoded header}.{base64 encoded payload}를 암호화한다.


Json Web Token의 사용 방법

Json Web Token의 중요한 정보를 담고있는 payload부분에 아무런 암호화를 하지 않는다.
base64 인코딩이 되어있지만 이는 보안의 목적이 아닌 데이터 전송을 위하여 데이터의 형태만 변화한 것이다.
즉 Json Web Token의 header와 payload는 손쉽게 변조될 수 있다.
그렇기 때문에 이 데이터가 올바른 데이터임을 보장하기 위해서 verify signature가 존재한다.

verify signature는 {base64 encoded header}.{base64 encoded payload}를 본인만 알고있는 secret key를 이용하여 암호화한다.
즉, 가져온 JWT의 {base64 encoded header}.{base64 encoded payload}를 암호화한 값과 가져온 JWT의 verify signature가 일치한다면 이 JWT는 본인이 작성한 JWT임을 알 수 있게 된다.
누군가가 header나 payload의 내용은 변조할 경우, 그에 맞는 verify signature를 구할 수 없어서 서비스에서 검증을 통과할 수 없다.

이 secret key를 대칭키가 아닌 비대칭키로 사용하여 private key로 암호화하고 public key로 검증한다면 다른 서비스에 내 데이터를 안전하게 전달할 수 있다.
단, 어디까지나 데이터가 변조되지않음을 보장할 뿐 데이터가 외부에 노출되어 있기 때문에 중요한 정보는 암호화 없이 JWT로 제공하는 방법은 옳지 못하다.

세션을 대신하여 JWT의 사용

대칭키 방법의 JWT는 로그인 후 Session을 대신하여 authentication을 제공하는데 많이 사용된다. Session 방식의 로그인은 유저가 로그인시 서버의 Session에 유저정보를 저장하고 User에겐 SessionID를 Cookie로 제공한다.
JWT를 이용하는 방식은 유저가 로그인시 User에게 유저정보가 담긴 JWT를 Cookie로 제공한다. 이 쿠키를 매 Http Request마다 검증하여 JWT의 Payload에 담긴 유저정보를 바탕으로 유저에게 서비스를 제공한다.


Json Web Token 사용하기

Json Web Token은 웹 표준 기술이기 때문에 이미 많은 라이브러리가 다양한 언어로 제공되고 있다. 자세한 내용은 https://jwt.io/에서 확인할 수 있다.