2024.07.25 - [NodeJs] - [Node JS] JWT토큰 구현하기
[Node JS] JWT토큰 구현하기
오늘은 로그인할때 JWT토큰을 발급하여 사용자들을 관리하는 기능을 구현해보겠습니다. 2024.07.25 - [NodeJs] - Node js 로그인 기능 구현 Node js 로그인 기능 구현2024.07.25 - [NodeJs] - Node js 회원가입 기
dbsxo4083.tistory.com
JWT토큰을 구현하는 것은 이전 포스팅을 참고하여 주시기 바랍니다.
지난시간에 만든 JWT토큰으로 사용자가 어떤 기능을 접근할때 토큰을 확인하여 올바른 사용자인지 확인하는 기능을 구현하려고 합니다.
간단하게 휴대폰 번호를 확인하는 API를 작성하였습니다. 아이디를 확인하는 API와 다르지 않으니 이해가 잘 되지 않으시다면 이전 블로그 포스팅을 참고하여 주시기 바랍니다.
2024.07.25 - [NodeJs] - [Node JS] 아이디 찾기 기능 구현
[Node JS] 아이디 찾기 기능 구현
2024.07.25 - [NodeJs] - Node js 회원가입 기능 구현(2) { const conn = await dbConnection() try { const query = "INSERT INTO user (id, name, email, phoneNumber, password) VALUES(?,?,?,?,?)" const values = [data.id, data.name, data.email, data.phon" d
dbsxo4083.tistory.com
jwt/jwt.js
const jwt = require('jsonwebtoken')
const secretKey = require("../config/jwt").secretKey
const options = require("../config/jwt").option
const TOKEN_EXPIRED = -3; //토큰의 유효기간 만료
const TOKEN_INVALID = -2; //토큰의 유효성 검사 실패, 유효하지 않은 토큰
module.exports = {
sign: (user) => { //sign메소드는 토큰을 만들어주어 클라이언트에게 발급
const payload = {
idx: user.id,
license:user.license,
//exp: Math.floor(Date.now() / 1000) + 3 //3초 (테스트용)
//exp: Math.floor(Date.now() / 1000) + (60 * 1) // 1분
exp: Math.floor(Date.now() / 1000) + 900 // 15분
//exp: Math.floor(Date.now() / 1000) + 600 // 10분
};
const expiresAt = new Date(payload.exp * 1000); // UTC로 변환된 시간
const localExpiresAt = expiresAt.toLocaleString(); // 로컬 시간으로 변환
const result = {
token: jwt.sign(payload, secretKey, options),
expiresAt: localExpiresAt
}
console.log(result)
return result;
},
verify : async (token) => { //verity 메소드는 발급받은 토큰이 제대로 만들어진 토큰인지 검증함
let decode;
try {
decode = jwt.verify(token, secretKey,{ignoreExpiration : false})
console.log("decode값:",decode)
}
catch(err){
if(err.message === 'jwt expired'){
console.log('expired token')
return TOKEN_EXPIRED;
} else if (err.message === 'invalid token'){
console.log('invalid token');
console.log(TOKEN_INVALID);
return TOKEN_INVALID;
} else {
console.log("invalid token")
return TOKEN_INVALID;
}
}
return decode;
}
}
jwt.js에 verify라는 함수를 추가하였습니다. verify는 발급받은 토큰이 제대로 인증된 토큰인지, 만료된 토큰은 아닌지 검사하는 함수입니다.
- jwt.verify(token, secretKey, { ignoreExpiration: false }):
- jwt.verify는 JWT의 유효성을 검증하는 메서드입니다.
- token: 검증할 JWT.
- secretKey: JWT를 서명할 때 사용된 비밀 키. 이 키로 서명된 JWT만 검증할 수 있습니다.
- { ignoreExpiration: false }: JWT의 만료 여부를 무시하지 않도록 설정합니다. false로 설정하면 만료된 JWT는 유효하지 않다고 간주됩니다.
- let decode;:
- 검증된 JWT의 페이로드를 저장할 변수를 선언합니다.
- try { ... } catch (err) { ... }:
- try 블록에서 JWT를 검증하고, 검증 실패 시 catch 블록에서 오류를 처리합니다.
- decode = jwt.verify(token, secretKey, { ignoreExpiration: false });:
- JWT를 검증하고, 검증이 성공하면 페이로드를 decode 변수에 저장합니다.
- console.log("decode값:", decode);:
- 검증된 JWT의 페이로드를 로그로 출력합니다.
- catch (err):
- JWT 검증 중 오류가 발생하면 이 블록이 실행됩니다.
- err.message === 'jwt expired':
- JWT가 만료되었음을 의미합니다. TOKEN_EXPIRED 값을 반환합니다.
- err.message === 'invalid token':
- JWT가 유효하지 않음을 의미합니다. TOKEN_INVALID 값을 반환합니다.
- 기타 오류:
- 위의 두 가지 경우 외의 오류는 모두 유효하지 않은 토큰으로 간주하고 TOKEN_INVALID 값을 반환합니다.
- return decode;:
- JWT가 유효할 경우, 검증된 페이로드를 반환합니다.
middleware/authorization.js
const jwt = require('../jwt/jwt')
const TOKEN_EXPIRED = -3;
const TOKEN_INVALID = -2;
const verifyToken = {
checkToken: async (req, res, next) =>{
let token = req.headers.token;
console.log("token:",token)
if (!token){ //토큰이 없을 경우
return res.status(500).json({
result: false,
code: "E11",
//message: errorCode.E11.message
});
}
const user = await jwt.verify(token);
console.log("유저값:",user)
/* console.log(user.idx) */
//토큰 유효기한 만료
if (user === TOKEN_EXPIRED){
return res.status(500).json({
result: false,
code: "E12",
// message: errorCode.E12.message
});
}
//유효하지 않는 토큰
if(user === TOKEN_INVALID){
return res.status(500).json({
result: false,
code: "E13",
// message: errorCode.E13.message,
})
}
if(user === undefined) {
return res.status(500).json({
result: false,
code: "E14",
// message: errorCode.E13.message,
});
}
req.idx = user.idx;
next();
},
}
- const jwt = require('../jwt/jwt');:
- jwt 모듈을 가져옵니다. 이 모듈은 JWT를 생성하고 검증하는 기능을 제공합니다.
- const TOKEN_EXPIRED = -3;:
- 토큰이 만료되었음을 나타내는 상수입니다.
- const TOKEN_INVALID = -2;:
- 토큰이 유효하지 않음을 나타내는 상수입니다.
- checkToken: async (req, res, next) => { ... }:
- checkToken은 미들웨어 함수로, Express.js의 요청 처리 파이프라인에서 호출됩니다.
- req: 요청 객체. 클라이언트의 요청 정보가 포함됩니다.
- res: 응답 객체. 클라이언트에게 응답을 반환합니다.
- next: 다음 미들웨어 또는 라우트 핸들러를 호출하는 함수입니다.
- let token = req.headers.token;:
- 요청 헤더에서 token을 가져옵니다. 이 token은 클라이언트가 보낸 JWT입니다.
- if (!token) { ... }:
- token이 없는 경우, 500 상태 코드와 함께 오류 응답을 반환합니다. 이 경우는 서버 측에서 클라이언트에게 오류를 알리는 상태입니다. 여기서 상태 코드는 401이 더 적절할 수 있습니다.
- const user = await jwt.verify(token);:
- jwt.verify 메서드를 호출하여 토큰의 유효성을 검증합니다. 검증된 사용자 정보를 user 변수에 저장합니다.
- if (user === TOKEN_EXPIRED) { ... }:
- 토큰이 만료된 경우, 500 상태 코드와 함께 TOKEN_EXPIRED 오류 코드를 반환합니다.
- if (user === TOKEN_INVALID) { ... }:
- 토큰이 유효하지 않은 경우, 500 상태 코드와 함께 TOKEN_INVALID 오류 코드를 반환합니다.
- if (user === undefined) { ... }:
- user가 undefined인 경우, 500 상태 코드와 함께 오류 응답을 반환합니다. 이 경우는 예기치 않은 오류가 발생했음을 나타냅니다.
- req.idx = user.idx;:
- 검증된 user 객체의 idx 속성을 요청 객체에 추가합니다. 이후의 미들웨어나 라우트 핸들러에서 이 idx를 사용할 수 있습니다.
- next();:
- 검증이 완료되면, 다음 미들웨어나 라우트 핸들러로 제어를 넘깁니다.
routes/userRoutes.js
const express = require('express')
const router = express.Router()
const userController = require('../controller/userController')
const authUtil = require('../middleware/authorization').checkOne
router.post('/auth',userController.register)
router.post('/login',userController.login)
router.post('/checkId',userController.checkId)
router.post('/checkPhoneNum',authUtil,userController.checkPhoneNum)
router.post('/checkEmail',userController.checkEmail)
module.exports = router;
🔎Api Tester로 요청을 보냈을때
-토큰을 포함하지 않은 경우

-토큰을 잘못 입력해서 보냈을 경우

'NodeJs' 카테고리의 다른 글
| [Node JS]네이버 로그인 오픈 api 구현 (0) | 2024.08.26 |
|---|---|
| [Node JS] sha256를 이용해서 비밀번호 암호화 하기 (0) | 2024.07.29 |
| [Node JS] JWT토큰 구현하기 (0) | 2024.07.25 |
| [Node JS] 아이디 찾기 기능 구현 (0) | 2024.07.25 |
| [Node JS] 로그인 기능 구현 (0) | 2024.07.25 |