본문 바로가기

TOPIC

Node.js 서버에서 Jwt 토큰 사용하기

반응형

Jwt 토큰은 Json Web Token의 약자입니다. 말그대로 Json 포맷 데이터를 가지고 있는 토큰입니다. 

https://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

Jwt 토큰은 3가지 형태로 나누어저 있는데 , header, payload, signature 지금은 Node에서 어떻게 Jwt 토큰을 다루는지에 대해서 학습하겠습니다.!!!

 

Header

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

- 타입은 JWT

- 해싱 알고리즘은 HS256을 사용합니다. (단방향 해시라고 하는데요 보통 암호화에 많이 사용합니다 데이터베이스에 비빌번호 그자체를 저장하는 것보단 단방향 해시를 사용해서 저장을 많이합니다!)

 

Payload

iss : 토큰 발급자 (issuer)
sub : 토큰 제목 (subject)
aud : 토큰 대상자 (audience)
exp : 토큰의 만료시간 (expiration) / 형식은 NumericDate
nbf : Not Before 을 의미 / 토큰의 활성 날짜

- 이외의 public, private 암호화 코드가 있습니다.

 

Signature

HMACSHA256(
  base64UrlEncode(header) 
  + "." 
  + base64UrlEncode(payload),
  secretkey)

- Header + Payload + Signature 정보를 사용하여 유일한 문자열을 만들어냅니다. 이토큰이 JWT토큰입니다.

 

자 Node.js에 적용해보겠습니다. npm 으로 필요한 패키지를 다운로드 해줍니다.

npm install rand-token
npm install jsonwebtoken

config 파일을 설정합니다. 이값은 JWT 토큰에서 서버쪽에서만 가지고 있어야하는 값이기 때문에 다른사람에게 노출되면 안됩니다.

 

jwtCong.js

const jwtConfig = {
    secretKey : 'JwTtOkEnTeSt',
    options : {
        algorithm : "HS256",
        expiresIn : "60m",
        issuer : "issuer"
    }
}

module.exports = jwtConfig;

- JSON 형태로 jwt토큰의 개인 설정들을 해줍니다. 이 때 secreKey는 서버쪽에서만 알고잇어야하는 prviate한 값입니다.

- 저는 설정을 JSON형태로 하였는데 파일형식은 상관없습니다! (js에서 json이 다루기 쉬워서 사용)

 

함수를 만듭니다. 이 함수는 두개의 기능을 합니다.

sign : jwt 생성

verify: 유효성 검증 및 유효하다면 jwt payload값 추출

 

const randToken = require('rand-token');
const jwt = require('jsonwebtoken');
const secretKey = require('../config/jwtConfig').secretKey;
const options = require('../config/jwtConfig').options;

module.exports = {
    sign: async (info) => {
        const payload = {
            id: info.id,
            nickname: info.nickname,
            userImage: info.userImage,
            type: info.type,
        };

        const result = {
            token: jwt.sign(payload, secretKey, options),
            refreshToken: randToken.uid(256)
        };

        return result;
    },
    verify: async (token) => {
        let decoded;
        try {
            decoded = jwt.verify(token, secretKey);
        } catch (error) {
            if(error.message === 'jwt expired') {
                console.log('유효기간 완료 토큰 입니다.');
            } else if(error.message === 'invalid token') {
                console.log('유효하지 않은 토큰입니다.');
            } else {
                console.log('유효하지 않은 토큰입니다.');
            }
        }

        return decoded;
    }
}

 

메인 컨트롤러에서 다음과 같이 사용합니다.

const jwt = require('../modules/jwt');

router.get(`/`, async (req, res) => {
	const jwtToken = await jwt.sign(/*info 값*/);
    const verify = await jwt.verify(jwtToken.token);
    res.send(jwtToken.token +"       "+ verify);
};

 

다음을 실행하면 다음과 같이 jwtToken 값과 인증되 Object 결과를 얻을 수가 있습니다.

그러면 이 토큰값을 쿠키로 보내서 클라이언트에게 저장하고있다가 유효한 인증이 필요한 경우 header에 jwt토큰을 보내면 끝입니다!

반응형