[Kit-Pay] JWT

손우진·2020년 11월 9일
1

Kit-Pay

목록 보기
4/6

JWT란?

  • 클라이언트와 서버, 서비스와 서비스 사이 통신 시 권한 인가(Authorization)를 위해 사용하는 토큰
  • URL에 대해 안전한 문자열로 구성 -> HTTP 어디든 위치할 수 있다.

정의

URL, Cookie, Header와 같이 사용할 수 있는 문자가 제한된 환경에서 정보를 주고받을 수 있게 하는 데이터 표현 형식(Format)

구조

헤더(Header), 페이로드(Payload), 서명(Signature) 세 부분을 점(.)으로 구분하는 구조

HEADER . PAYLOAD . SIGNATURE

  • 헤더(Header) : 토큰의 타입과 해시 암호화 알고리즘으로 구성
{
    "alg": "ES256",
    "kid": "Key ID"
}

=>

Base64URLSafe(UTF-8('{"alg": "ES256","kid": "Key ID"}')) => eyJhbGciOiJFUzI1NiIsImtpZCI6IktleSBJRCJ9

JWT를 어떻게 검증(Verify)하는가에 대한 내용, alg: 알고리즘, kid : key 식별 값

  • 페이로드(Payload) : 토큰에 담을 클레임(claim)들 정보
    - Payload 에 담는 정보의 한 ‘조각’ 을 클레임 (name / value 의 한 쌍)
    • 페이로드(Payload)에 있는 속성들을 클레임 셋(Claim Set)
    • 클레임 셋은 JWT에 대한 내용(토큰 생성자(클라이언트)의 정보, 생성 일시 등)이나 클라이언트와 서버 간 주고 받기로 한 값들로 구성
{
    "iss": "jinho.shin",
    "iat": "1586364327"
}

=>

Base64URLSafe('{"iss": "jinho.shin","iat": "1586364327"}') -> eyJpYXQiOjE1ODYzNjQzMjcsImlzcyI6ImppbmhvLnNoaW4ifQ

  • 서명(Signature) : secret key를 포함하여 암호화됨
    점(.)을 구분자로 해서 헤더와 페이로드를 합친 문자열을 서명한 값
    서명은 헤더의 alg에 정의된 알고리즘과 비밀 키를 이용해 성성하고 Base64 URL-Safe로 인코딩한다.

    Base64URLSafe(Sign('ES256', '${PRIVATE_KEY}',
    'eyJhbGciOiJFUzI1NiIsImtpZCI6IktleSBJRCJ9.eyJpYXQiOjE1ODYzNjQzMjcsImlzcyI6ImppbmhvLnNoaW4ifQ'))) ->
    MEQCIBSOVBBsCeZ_8vHulOvspJVFU3GADhyCHyzMiBFVyS3qAiB7Tm_MEXi2kLusOBpanIrcs2NVq24uuVDgH71M_fIQGg

구현 IN KIT-PAY

  • 토큰 생성 코드
const jwt = require('jsonwebtoken');			    
const secret = req.app.get('jwt-secret');
const token = jwt.sign({user_id: id}, secret,{expiresIn: '1h'});
  • 토큰 검증 코드(REST)
const jwt = require('jsonwebtoken');
const verifyToken = (req, res, next) => {
    try {
        const secret = req.app.get('jwt-secret');
        const clientToken = req.cookies.user;
        const decoded = jwt.verify(clientToken, secret);
        if (decoded) {
            res.locals.userId = decoded.user_id;
            next();
        } else {
            res.status(401).json({ error: 'unauthorized' });
        }
    } catch (err) {
        console.log(err);
        res.status(401).json({ error: 'token expired' });
    }
};

JWT 토큰 사용 이유

  • Access Token vs JWT in MSA

    이러한 MSA 구조에서는 서비스가 많아질수록 권한 서버의 과부하가 심해진다.

    JWT에는 값이 들어 있어 그 값을 이용하기에 권한 서버와의 통신은 JWT 발급에서 끝난다.
    Kit-Pay에서는 이러한 MSA의 철학을 최대한으로 고려하고 싶었고, api 서버 뿐 아니라 블록체인 서버에서도 JWT를 이용하여 권한을 인증한다.
profile
Backend Developer @비바리퍼블리카

2개의 댓글

comment-user-thumbnail
2020년 11월 9일

앗 혹시 토큰을 쿠키에 담으시는 이유가 있으실까요 ?

1개의 답글