utils/auth.js(token) 간단 설명
코드 분석
객체 디스트럭처링(destructuring)을 사용하여 verifyToken
함수가 반환한 객체의 속성을 개별 변수에 할당하는 과정입니다. 이를 이해하려면 verifyToken
함수의 동작을 먼저 살펴볼 필요가 있습니다.
verifyToken
함수
const jwt = require('jsonwebtoken');
const verifyToken = (req) => {
const authorHeader = req.headers.authorization;
if (!authorHeader) {
return { error: true, message: "토큰이 없습니다.", status: 401 };
}
const token = authorHeader.split(" ")[1];
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
return { error: false, decoded };
} catch (error) {
return { error: true, message: `유효하지 않은 토큰입니다: ${error.message}`, status: 401 };
}
};
module.exports = verifyToken;
함수 동작 설명
- Authorization 헤더 확인:
req.headers.authorization
에서 토큰을 가져옵니다.- 만약 헤더가 존재하지 않으면
error: true
,message: "토큰이 없습니다."
,status: 401
을 반환합니다.
- 토큰 추출:
authorHeader.split(" ")[1]
을 사용하여 “Bearer “ 부분을 제거하고 실제 토큰을 추출합니다.
- 토큰 검증:
jwt.verify(token, process.env.JWT_SECRET)
을 사용하여 토큰을 검증합니다.- 검증에 성공하면
error: false
와 디코드된 토큰 정보(decoded
)를 반환합니다. - 검증에 실패하면
error: true
,message: "유효하지 않은 토큰입니다"
,status: 401
을 반환합니다.
디스트럭처링 할당
이제 verifyToken
함수가 반환한 객체를 디스트럭처링하는 부분을 자세히 살펴보겠습니다.
const { error, decoded, message, status } = verifyToken(req);
디스트럭처링 설명
verifyToken(req)
가 호출되면, 이 함수는 객체를 반환합니다. 반환된 객체의 속성들을 개별 변수에 할당하는 것이 디스트럭처링 할당입니다. 여기서 verifyToken
함수가 반환할 수 있는 두 가지 객체 형태를 가정해 봅시다:
토큰이 유효한 경우
{
error: false,
decoded: { /* 디코드된 토큰 정보 */ }
}
토큰이 유효하지 않은 경우
{
error: true,
message: "유효하지 않은 토큰입니다: <에러 메시지>",
status: 401
}
할당 과정
error
: 반환된 객체의error
속성을error
변수에 할당합니다.decoded
: 반환된 객체의decoded
속성을decoded
변수에 할당합니다. 만약error: true
인 경우 이 속성은 존재하지 않을 수 있습니다.message
: 반환된 객체의message
속성을message
변수에 할당합니다. 만약error: false
인 경우 이 속성은 존재하지 않을 수 있습니다.status
: 반환된 객체의status
속성을status
변수에 할당합니다. 만약error: false
인 경우 이 속성은 존재하지 않을 수 있습니다.
예시
유효한 토큰 예시
만약 verifyToken
함수가 유효한 토큰을 반환하면:
const { error, decoded, message, status } = verifyToken(req);
이 경우 error
는 false
, decoded
는 디코드된 토큰 정보, message
와 status
는 undefined
가 됩니다.
유효하지 않은 토큰 예시
만약 verifyToken
함수가 유효하지 않은 토큰을 반환하면:
const { error, decoded, message, status } = verifyToken(req);
이 경우 error
는 true
, decoded
는 undefined
, message
는 “유효하지 않은 토큰입니다: <에러 메시지="">", `status`는 `401`이 됩니다.에러>
적용 예시
const { reviewModel, movieModel } = require('../model');
const verifyToken = require('../utils/auth');
// 리뷰 생성
exports.postReview = async (req, res) => {
const { error, decoded, message, status } = verifyToken(req, res); // auth.js 적용
if (error) {
console.log(message);
return res.status(status).json({ message });
}
const { memberId } = decoded;
const { movieId, rating, content } = req.body;
try {
const review = await reviewModel.create({
memberId, movieId, content, reviewMovieRating: rating
});
요약
verifyToken
함수는 토큰을 검증하여 결과를 객체로 반환합니다.- 디스트럭처링 할당을 통해 반환된 객체의 속성들을 개별 변수에 할당합니다.
- 이 과정을 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.