웹 풀스택

[도서 쇼핑몰] Node.j JWT 적용하기

kevinmj12 2025. 3. 24. 22:27

JWT 기본 코드

const express = require("express");
const app = express();
const jwt = require("jsonwebtoken");
require("dotenv").config();

app.listen(3000);

// JWT 발급
app.get("/", (req, res) => {
  const token = jwt.sign({ foo: "bar" }, process.env.PRIVATE_KEY);
  res.cookie("jwt", token, {
    httpOnly: true,
  });
  res.send("토큰 발행 완료");
});

// JWT 검증
app.get("/decode", (req, res) => {
  const token = req.headers.authorization;
  const decoded = jwt.verify(token, process.env.PRIVATE_KEY);

  res.send(decoded);
});

JWT 발급

app.get("/", (req, res) => {
  const token = jwt.sign({ foo: "bar" }, process.env.PRIVATE_KEY);
  res.cookie("jwt", token, {
    httpOnly: true,
  });
  res.send("토큰 발행 완료");
});

jwt.sign()을 통해 사용자의 정보와 개인키를 넣고 JWT를 발급해줄 수 있다.

JWT 검증

app.get("/decode", (req, res) => {
  const token = req.headers.authorization;
  const decoded = jwt.verify(token, process.env.PRIVATE_KEY);

  res.send(decoded);
});

token을 header의 authorization 항목을 통해 받아온 뒤, jwt.verify()를 통해 검증할 수 있다.

이전에 발급받은 토큰을 넣어 실행해본 결과는 다음과 같다.

참고로 iat는 issued at의 약자로 토큰이 발급된 시간이다.

 

API에 JWT 적용

이제 "로그인"을 요구하는 모든 API에 JWT를 넣어 구현해보자.

대표적으로 "좋아요" API에 JWT를 적용하는 과정은 다음과 같다.

로그인

const login = (req, res) => {
  const { email, password } = req.body;
  const sql = `SELECT * FROM users WHERE email = ?;`;
  const values = email;

  conn.query(sql, values, (err, results) => {
    if (err) {
      return res.status(StatusCodes.BAD_REQUEST).json({
        msg: `Error: ${err.code}`,
      });
    }
    const loginUser = results[0];

    const salt = loginUser.salt;
    const hashPassword = crypto
      .pbkdf2Sync(password, salt, 10000, 10, "sha512")
      .toString("base64");

    if (loginUser && hashPassword == loginUser.password) {
      const token = jwt.sign(
        {
          id: loginUser.id,
          email: loginUser.email,
        },
        process.env.PRIVATE_KEY,
        {
          expiresIn: "5m",
          issuer: "minje",
        }
      );
      res.cookie("token", token, {
        httpOnly: true,
      });

      return res.status(StatusCodes.OK).json("results");
    } else {
      return res.status(StatusCodes.UNAUTHORIZED).end();
    }
  });
};

이제 JWT.id를 통해 토큰으로 로그인한 사용자의 아이디, 이메일 등 정보를 알 수 있게 되었다.

 

좋아요

const addLike = (req, res) => {
  const { likedBookId } = req.body;
  const token = req.headers.authorization;
  const decodedToken = jwt.verify(token, process.env.PRIVATE_KEY);

  const sql = `INSERT INTO likes (user_id, liked_book_id) VALUES (?, ?);`;
  const values = [decodedToken.id, likedBookId];

  conn.query(sql, values, (err, results) => {
    if (err) {
      return res.status(StatusCodes.BAD_REQUEST).json({
        msg: `Error: ${err.code}`,
      });
    }
    return res.status(StatusCodes.CREATED).json(decodedToken);
  });
};