코드 분석

객체 디스트럭처링(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;

함수 동작 설명

  1. Authorization 헤더 확인:
    • req.headers.authorization에서 토큰을 가져옵니다.
    • 만약 헤더가 존재하지 않으면 error: true, message: "토큰이 없습니다.", status: 401을 반환합니다.
  2. 토큰 추출:
    • authorHeader.split(" ")[1]을 사용하여 “Bearer “ 부분을 제거하고 실제 토큰을 추출합니다.
  3. 토큰 검증:
    • 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
}

할당 과정

  1. error: 반환된 객체의 error 속성을 error 변수에 할당합니다.
  2. decoded: 반환된 객체의 decoded 속성을 decoded 변수에 할당합니다. 만약 error: true인 경우 이 속성은 존재하지 않을 수 있습니다.
  3. message: 반환된 객체의 message 속성을 message 변수에 할당합니다. 만약 error: false인 경우 이 속성은 존재하지 않을 수 있습니다.
  4. status: 반환된 객체의 status 속성을 status 변수에 할당합니다. 만약 error: false인 경우 이 속성은 존재하지 않을 수 있습니다.

예시

유효한 토큰 예시

만약 verifyToken 함수가 유효한 토큰을 반환하면:

const { error, decoded, message, status } = verifyToken(req);

이 경우 errorfalse, decoded는 디코드된 토큰 정보, messagestatusundefined가 됩니다.

유효하지 않은 토큰 예시

만약 verifyToken 함수가 유효하지 않은 토큰을 반환하면:

const { error, decoded, message, status } = verifyToken(req);

이 경우 errortrue, decodedundefined, 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 함수는 토큰을 검증하여 결과를 객체로 반환합니다.
  • 디스트럭처링 할당을 통해 반환된 객체의 속성들을 개별 변수에 할당합니다.
  • 이 과정을 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.