JWT(JSON Web Token)

이환희·2021년 3월 26일
0

Web

목록 보기
8/14

JWT란?

JSON Web Token (JWT) 은 웹표준 (RFC 7519) 으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달해준다.


구성

헤더

헤더는 두가지 정보를 지님

  • typ : 토큰의 타입
  • alg : 해싱 알고리즘 지정

-> 인코딩 하면

const header = {
  "typ": "JWT",
  "alg": "HS256"
};

// encode to base64
const encodedPayload = new Buffer(JSON.stringify(payload))
                            .toString('base64')
                            .replace('=', '');
console.log('payload: ',encodedPayload);

결과
header: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

정보(payload)

  • 여기엔 토큰에 담을 정보가 들어감
  • 정보의 한 조각을 '클레임'이라 함
  • 클레임엔 등록된(registered)클레임, 공개(public) 클레임, 비공개(private) 클레임이 존재함

등록된 클레임

서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보를 담기위하여 이름이 이미 정해진 클레임

  • iss : 토큰 발급자
  • sub : 토큰 제목
  • aud : 토큰 대상자
  • exp : 토큰 만료시간
  • nbf : Not Before. 토큰 활성 날짜
  • iat : 토큰이 발급된 시간
  • jti : JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됨

공개 클레임

클레임 이름을 URI형식으로 지음(충돌 방지를 위해)

ex)

{
    "https://velopert.com/jwt_claims/is_admin": true
}

비공개 클레임

등록X, 공개X인 클레임. 양측이 협의하에 사용되고 중복이 되어 충돌날 수 있으니 주의해야함

ex)

{
    "username": "velopert"
}

-> 인코딩 하면

const payload = {
    "iss": "velopert.com",
    "exp": "1485270000000",
    "https://velopert.com/jwt_claims/is_admin": true,
    "userId": "11028373727102",
    "username": "velopert"
};

// encode to base64
const encodedPayload = new Buffer(JSON.stringify(payload))
                            .toString('base64')
                            .replace('=', '');

console.log('payload: ',encodedPayload);

결과
payload: eyJpc3MiOiJ2ZWxvcGVydC5jb20iLCJleHAiOiIxNDg1MjcwMDAwMDAwIiwiaHR0cHM6Ly92ZWxvcGVydC5jb20vand0X2NsYWltcy9pc19hZG1pbiI6dHJ1ZSwidXNlcklkIjoiMTEwMjgzNzM3MjcxMDIiLCJ1c2VybmFtZSI6InZlbG9wZXJ0In0

서명

헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성한다.

  • 헤더와 정보를 . 으로 합쳐준뒤
  • secret으로 해싱하고
  • base64로 인코딩
const crypto = require('crypto');
const signature = crypto.createHmac('sha256', 'secret')
             .update(encodedHeader + '.' + encodedPayload)
             .digest('base64')
             .replace('=', '');

console.log('signature: ',signature);

결과
signiture: WE5fMufM0NDSVGJ8cAolXGkyB5RmYwCto1pQwDIqo2w

JWT의 특징

  • 수많은 프로그래밍 언어에서 지원된다
  • 자가 수용적 (self-contained) 이다
  • 쉽게 전달 될 수 있다

사용되는 상황

  • 회원 인증
  • 정보교류




Reference

0개의 댓글

관련 채용 정보