Home bearer Token
Post
Cancel

bearer Token

Stateful 서버

클라이언트의 요청을 받을 때 마다, 클라이언트의 상태를 계속해서 유지하고, 그 정보를 서비스 제공에 이용 ex) 세션 |유지 서버

Stateless 서버

상태를 유지하지 않는 서버 ( 확장성이 높아진다)

서버 기반 인증의 문제점

  • 세션
    • 유저수 증가에 따른 부하 증가(메모리 또는 기타)
  • 확장성
    • 트래픽 분산을 위한 확장의 어려움
  • CORS
    • 여러 도매인에서 쿠키 관리의 어려움

Json Web Token(JWT)

  • 용도
    • 회원인증
    • 정보교환
  • 생김새
    1
    2
    
    aaaaaa.bbbbbbb.ccccccccc
    (header)(payload)(Signature)
    
  • 해더(header)
    • typ : 토큰 타입 (JWT)
    • alg : 해싱 알고리즘 (HMAC SHA256, RSA)
      1
      2
      3
      4
      
      {
      "typ" : "JWT"
      "alg" : "HMAC256"
      }
      
1
2
3
4
5
6
7
8
9
10
11
const header = {
  "typ" : "JWT"
  "alg" : "HMAC256"
}

//encode to base64
const encodeHeader = new Buffer(JSON.stringify(header))
                                .toString('base64')
                                .replace("=",''); //패딩 제거

  • 정보(payload)
    • 클레임
      • 정보의 한 조각을 클레임(claim)이라고 부름(name/value)
      • 등록된(registered), 공개(public), 비공개(private) 으로 구분
    • 등록된(registered) 클레임
      • 이미 정해진 클레임
      • 모두 선택적(optional)
      • 클레임명상세내용
        iss토큰발급자
        sub토큰제목
        aud토큰대상자
        exp토큰 만료시간(numbericDate)
        nbf토큰 활성시간(Not Before)
        iat토큰이 발급된 시간(age파악가능)
        jtiJWT 고유 식별자
    • 공개(public)클레임
      • 충돌 방지된 이름(URI 형식의 이름을 가짐)
        1
        2
        3
        
        {
        "https://linkHub.com" : true
        }
        
    • 비공개(private) 클레임
      • 클라이언트와 서버의 형희하에 사용되는 클레임 이름
      • 충돌 가능성이 있음
        1
        2
        3
        
        {
        "username" : "test"
        }
        
  • 예제
1
2
3
4
5
6
7
{
  "iss" : "LinkHub.com",
  "exp" : "1485300000000",
  "https://linkHub.com" : true,
  "username" : "test"

}
  • 서명(Signature)
    • 해더의 인코딩값과, 정보의 인코딩 값을 합친후 비밀키로 해쉬를 생성
    • hex => base64 인코딩
      1
      
      HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload) , secret)
      
    1
    2
    3
    4
    5
    6
    7
    
    const crypto = require('crypto');
    const Signature = crypto.createHmac('sha256', 'secret')
                                  .update(encodeHeader + '.' + encodepayload)
                                  .digest('base64')
                                  .replace("=",''); //패딩 제거
    
    
    • 토큰 완성
This post is licensed under CC BY 4.0 by the author.

자바스터디 15주차

webhook

Comments powered by Disqus.

Trending Tags