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');
};