본문 바로가기
경일/nodejs

[node.js] jwt, jsonwebtoken 라이브러리 이용해서 로그인하기

by dev_kong 2022. 3. 9.
728x90
728x90

0.목차

1. 개요

2. 세팅

3. 토큰생성(sign)

4. 디코드 payload(veryfy)

1. 개요

2022.03.03 - [경일/nodejs] - [node.js] 쿠키와 세션, 그리고 JWT

 

[node.js] 쿠키와 세션, 그리고 JWT

0. 목차 1. JWT가 뭔데. 2. JWT 구현 3. JWT로 로그인 해보기 1. JWT가 뭔데 JSON Web Token 의 약자다. 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미한다. 그런데 우리 이런 역할을 하

kong-dev.tistory.com

 

위 포스팅에서 jwt 방식으로 로그인을 구현했었다.

그리고 crypto 를 사용해서 직접 토큰을 암호화 하고,

64진수로 변환했던 payload를 다시 복호화 해서 사용했었다.

내용이 어렵진 않지만,

.. 굉장히 귀찮다..

그런데 이 귀찮은 걸 대신해주는 라이브러리가 있다..!

그리고 라이브러리를 하나하나 배울때 마다 느끼는 건데,

누군가가 나와 같은 생각을 했고,

그 사람이 똑똑한 사람이란것에 감사하게 된다..

2. 세팅

언제나 그렇듯 세팅은 매우 쉽다.

설치를 하고

$ npm install jsonwebtoken

땡겨온다

const jwt = require('jsonwebtoken');

준비 끝

3. 토큰생성(sign)

기존에 직접 구현했던 토큰은 만들기가 굉장히 힘들었다.

우선 헤더부분과 페이로드 부분을 스트링화 해서, 버퍼로 바꿨다가, 다시 64진수로 바꿨었다.

그리고 그 두개를 이어붙인뒤에 crypto 를 이용해서 salt 와 버무린 뒤, 암호화를 해서 시그니쳐를 만들었다.

그리고 인코딩된 헤더와 인코딩된 페이로드, 시그니처 이 세개를 . 으로 구분해서 하나의 스트링으로 만들면...

이게 토큰.. 이엇는데. 후우 힘들다.

말만해도 힘들다.

이 라이브러리는 무료로 토큰을 만들어줍니다..!

사용법도 간단하다.

jwt.sign(payload, secretKey, option)

이게 다임..

첫번째 인자값은 페이로드다. 그 페이로드 맞음

두번째 인자값은 시크릿키 인데 우리가 위에서 salt로 부르던 값이다.

그리고 세번째 인자값 옵션에는 어떠한 알고리즘을 사용할 것인지(HS256), 만료시간은 언제인지, 발급자는 누구인지 같은

정보들이 객체형태로 들어간다.

require('dotenv').config();
const jwt = require('jsonwebtoken');

const secretKey = process.env.SECRET_KEY;
const algorithm = process.env.JWT_ALG;
const expiresIn = process.env.JWT_EXP;
const issuer = process.env.JWT_ISSUER;

const option = { algorithm, expiresIn, issuer };

function makeToken(payload) {
  return jwt.sign(payload, secretKey, option);
}

나는 우선 jwt 파일을 따로 뺐고, secertKey(salt) 와 옵션에 들어갈 내용들은 전부 .env 파일에 담아뒀다.

이렇게 만들어진 토큰을

쿠키파서를 이용해서(res.setHeader 로 해도 된다)

쿠키로 설정해주면 된다.

4. 디코드 payload(verify)

오키 로그인에 성공했다.

그리고 디비와 통신하지 않고 바로바로 페이로드에서 정보를 빼서 사용해주고 싶다면,

쿠키에 담겨있는 토큰을 가져와서

페이로드 부분을 디코딩해주면 된다.

이 역시도 저번 포스팅에서는 직접 했다...

근데 이 라이브러리는 대신 해준다.

최고다... JWT!

jwt.verify(token, secretKey);

ㅎㅎ 이게 다다.

저 메서드의 리턴값이 페이로드를 디코딩 한 값이다.

너무나 편안하다..

require('dotenv').config();
const jwt = require('jsonwebtoken');

const secretKey = process.env.SECRET_KEY;
const algorithm = process.env.JWT_ALG;
const expiresIn = process.env.JWT_EXP;
const issuer = process.env.JWT_ISSUER;

const option = { algorithm, expiresIn, issuer };

function makeToken(payload) {
  return jwt.sign(payload, secretKey, option);
}

function decodePayload(token) {
  return jwt.verify(token, secretKey);
}

module.exports = { makeToken, decodePayload };

jwt.js 의 코드이다.

이외의 전체 코드는 깃헙에 있다.

728x90
728x90

댓글