JWT (Json Web Token)

JWT의 모습
xxxxx.yyyyy.zzzzz
header.payload.signature

JWT 웹 토큰의 헤더 정보

  • typ: 토큰의 타입, JWT만 존재
  • alg : 해싱 알고리즘. (HMAC, SHA256, or RSA). 토큰 검증시 사용.
    { 
      "typ" : "JWT",
      "alg" : "HS256"
    }
    /*
    이것들의 내용을 base64 로 인코딩 합니다.
    base 64는 암호화된 문자열이 아니고, 같은 문자열에 대해서는 항상 같은
    문자열을 반환합니다.
    */

Payload

JWT 웹 토큰의 중간, 실제 토큰으로 사용하려는 데이터가 담기는 부분,
각 데이터를 Claim이라고 하고 3가지가 있습니다.

  1. Reserved claims : 이미 예약된 Claim.

    • iss (String) : issuer, 토큰 발행자 정보
    • exp (Number) : expiration time, 만료일
    • sub (String) : subject, 제목
    • aud (String) : audience,
    • More
  2. Public claims : 사용자 정의 Claim

    • Public 이라는 이름처럼 공개용 정보
      • 충돌 방지를 위해 URL 포맷을 이용해 저장
  3. Private claims : 사용자 정의 Claim

    • Public claims 와 다르게 사용자가 임의로 정한 정보
{
    "name" : "spongeBob",
     "age" : 26
}

Signature

Header 와 Payload의 데이터 무결성과 변조 방지를 위한 서명
Header + Payload 를 합친 후, Secret 키와 함께 Header의 해싱 알고리즘으로 인코딩

secret읜 나만의 것 (아무거나 정의해도됨, 해커가 못 찾음)

    HMACSHA256(
        base64UrlEncode(header) + "." + 
          base64UrlEncode(payload),
          secret)
    )

스크린샷, 2019-09-08 03-02-27.png

verify

verify로 토큰을 확인해본다.

sign

    jwt.sign(payload, secretOrPrivateKey, [options, callback])

    const  jwt = require('jsonwebtoken');

    const payload = {
        name : 'spongeBob',
          email : 'hello@gmail.com',
          exp :  Date.now()/1000  + 60 * 60 // 60 은 밀리세컨 
    }