jsonwebtoken

zwundzwzig·2022년 9월 18일
0

security

목록 보기
1/1
post-thumbnail

서비스를 만들고 운영을 할 때, 사용자가 서비스를 이용할 수 있는지, 맞다면 어느 범위까지 이용할 수 있는지 판단해야 한다. 인증과 인가 절차를 통해 사용자를 판단하고(인증) 사용자에게 권한을 부여(인가)하는 과정을 진행한다.


이론적 탐구

JWT(JSON Web Token)은 URL에 안전한 간결한 표현 수단으로, 클라이언트와 서버 간 정보를 JSON 데이터로 전송하는 개방형 표준(RFC 7519)이다.

JSON 데이터 안에는 기본정보, 전달할 정보, 검증 정보가 모두 담겨 있고, Base64로 인코딩된 데이터와 전자 서명으로 구성되어 있다.

3가지 구성 요소

{
    "alg" : "HS256",
    "typ" : "JWT" 
}

헤더에는 알고리즘 정보와 토큰의 타입을 담고 있다.

그렇게 위 예제에선 HS256 알고리즘에 JWT 토큰을 활용하는 것을 알 수 있다.

Payload

{
    "exp": "1245678900", // Registered Claims
    "https://velopert.com/jwt_claims/is_admin": true, // Public Claims
    "user_id" : 12345123 // Private Claims
}
  1. Registered Claims: JWT 표준으로 지정된 Claim, 7가지가 있다.

    exp: 만료시간, jti: 고유 식별자
     iss: 발급자,  aud: 대상자
     sub: 제목, iat: 발급시간, nbf: 활성화 시간

exp, nbf, aud, sub, iss에 기본값은 없으며 함께 제공되지만, 같이 선언될 수는 없다.
exp, nbf, iat는 숫자열이 아니다.

  1. Public Claims : JWT를 사용하는 사람들이 공개적으로 정의하는 도메인.

  2. Private Claims : Public Claims과 달리 클라이언트와 서버가 합의해 사용한다.

만약 페이로드가 객체가 아닌 버퍼나 문자열 형식이라면 JSON 유효성을 검사하지 않는다. 대신 객체 형식이면 JSON.stringify를 통해 문자열로 반환될 수 있다.

jwt.sign - 토큰 발급

//with default HS256
var jwt = require('jsonwebtoken');
var token = jwt.sign({ foo: 'bar' }, 'shhhhh');

//with RS256
var privateKey = fs.readFileSync('private.key');
var token = jwt.sign(
  { foo: 'bar' }, 
  privateKey, 
  { algorithm: 'RS256'}
);

//asynchronously
jwt.sign(
  { foo: 'bar' }, 
  privateKey, 
  { algorithm: 'RS256' }, 
  (err, token) => console.log(token);
);

//Token Expiration with exp claim
jwt.sign(
  { data: 'foobar' }, 
  'secret', 
  { expiresIn: '1h' }
);
//or
jwt.sign(
  {
  exp: Math.floor(Date.now() / 1000) + (60 * 60),
  data: 'foobar'
}, 'secret');

jwt.verify - 토큰 검증

jwt.verfity(JWT String, secretOrPublicKey, (err, decoded) => {..}

참고

profile
개발이란?

0개의 댓글