4-1. JWT 발급하기

회원가입과 로그인이 성공하였을 때, JWT 토큰을 발급하는 방법을 알아보도록 하겠습니다.

우선, JWT 토큰을 인증하기위한 비밀 키가 필요합니다. .env 파일에 비밀 키를 정의해주세요.

.env

PORT=4000
MONGO_URI=mongodb://localhost/heurm
SECRET_KEY=MySecretKey1$1$234
JWT_SECRET=HEURM_JSON_WEB_TOKEN_KEY_!@#$

JWT 토큰을 만들때는, jsonwebtoken 모듈을 설치해서 사용합니다. 이전에 우리가 비밀번호 해쉬를 만들때 사용했던 crypto 를 직접 사용하여 토큰을 만들 수도 있지만, 조합과정이 꽤 번거로우므로 우리는 라이브러리를 사용해 생성을 하도록 하겠습니다.

$ yarn add jsonwebtoken

이 라이브러리를 사용하여 토큰을 사용 할 땐 다음과 같이 합니다:

const jwt = require('jsonwebtoken');
const token = jwt.sign({ foo: 'bar' }, 'secret-key', { expiresIn: '7d' }, (err, token) => {
    if(err) {
        console.log(err);
        return;
    }
    console.log(token);
});

첫번째 파라미터는 토큰에 넣을 데이터, 두번째는 비밀 키, 세번째는 옵션, 네번째는 콜백함수가 들어갑니다. 위 코드를 서버 메인파일 (index.js) 의 하단에 넣어보세요.

heurm server is listening to port 4000
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE0OTg1ODY1ODAsImV4cCI6MTQ5OTE5MTM4MH0.YMS-Z1PmRsjxyrtkLADayLJ99OEz0Bz
gpFZmeVXSRE8
Successfully connected to mongodb

토큰이 잘 프린트 되었나요?

이제, 토큰 생성을 프로미스 기반으로 만드는 함수를 만들겠습니다. 이 함수는, lib/token.js 파일안에 만들도록 하겠습니다. 이 파일에는 추후 JWT 를 처리하는 미들웨어도 구현됩니다.

src/lib/token.js

const jwtSecret = process.env.JWT_SECRET;
const jwt = require('jsonwebtoken');

/**
 * JWT 토큰 생성
 * @param {any} payload 
 * @returns {string} token
 */
function generateToken(payload) {
    return new Promise(
        (resolve, reject) => {
            jwt.sign(
                payload,
                jwtSecret,
                {
                    expiresIn: '7d'
                }, (error, token) => {
                    if(error) reject(error);
                    resolve(token);
                }
            );
        }
    );
};
exports.generateToken = generateToken;

토큰은 만들어지고나서 7일동안 유효하도록 설정을 하였습니다.

이제, Account 모델에서 이 함수를 불러온다음에, 인스턴스 메소드를 만들어서 사용하도록 하겠습니다.

src/models/account.js

const { generateToken } = require('lib/token');

(...)

Account.methods.generateToken = function() {
    // JWT 에 담을 내용
    const payload = {
        _id: this._id,
        profile: this.profile
    };

    return generateToken(payload, 'account');
};

results matching ""

    No results matching ""