네, 제가 접근을 요청한 사람입니다

발행: (2025년 12월 16일 오전 08:47 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

NOTE: This is my first post, so apologies in advance if I’ve misunderstood something. I’m open to discussions and corrections.

JWT란 무엇인가?

JWT는 JSON Web Token의 약자입니다. JSON 객체 형태로 파티 간에 정보를 안전하게 전송하기 위한 컴팩트하고 자체 포함된 방식을 정의합니다. 이 정보는 디지털 서명으로 검증 및 신뢰될 수 있습니다.

  • JWT는 수명이 짧으며, 정해진 시간 후에 만료됩니다.
  • 서명된 토큰은 포함된 클레임의 무결성을 검증합니다.
  • 암호화된 토큰은 다른 파티가 클레임을 볼 수 없게 숨깁니다.

JWT의 사용

인증(Authorization)

JWT의 가장 일반적인 사용 사례는 인증—라우트, 서비스 및 리소스에 대한 접근을 제어하는 것입니다.

  • Authentication → 사용자가 누구인지 확인합니다.
  • Authorization → 사용자가 어떤 자원에 접근할 수 있는지 결정합니다.

정보 교환

JWT는 파티 간 보안 정보 교환에도 사용할 수 있습니다. 공개/비공개 키 쌍으로 서명될 수 있기 때문에, 발신자가 주장하는 사람임을 확신할 수 있습니다.

JWT 구조

JWT는 점(.)으로 구분된 세 부분으로 구성됩니다:

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload

{
  "userId": 123,
  "email": "user@example.com",
  "role": "admin",
  "exp": 1712345678
}

Signature

서명은 다음과 같이 생성됩니다:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret_key
)

JWT 인증 흐름

  1. 사용자가 이메일과 비밀번호로 로그인합니다.
  2. 서버가 자격 증명을 검증합니다.
  3. 서버가 비밀 키를 사용해 JWT를 생성합니다.
  4. JWT가 클라이언트에 전송됩니다.
  5. 클라이언트가 JWT를 저장합니다(쿠키 또는 localStorage).
  6. 클라이언트가 각 요청마다 Authorization 헤더에 JWT를 포함합니다.
  7. 서버가 JWT를 검증하고 유효하면 접근을 허용합니다.

JWT의 장점

  • 무상태 인증(요청당 DB 조회가 필요 없음).
  • 빠르고 확장성이 좋음.
  • 마이크로서비스 간 사용이 용이.
  • REST API 및 모바일 앱과 잘 어울림.

JWT의 단점

  • 토큰을 쉽게 폐기할 수 없음.
  • 토큰이 탈취되면 공격자가 접근 권한을 얻게 됨.
  • 페이로드는 읽을 수 있음(암호화되지 않음).
  • 큰 토큰은 요청 크기를 증가시킴.

Express.js에서 JWT 사용

토큰 생성

const jwt = require("jsonwebtoken");

const token = jwt.sign(
  { userId: user._id },
  process.env.JWT_SECRET,
  { expiresIn: "1h" }
);

토큰 검증(미들웨어)

const verifyToken = (req, res, next) => {
  const token = req.headers.authorization?.split(" ")[1];
  if (!token) return res.status(401).json({ message: "No token" });

  jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
    if (err) return res.status(403).json({ message: "Invalid token" });
    req.user = decoded;
    next();
  });
};

마무리 생각

JWT는 강력하고 빠르며 널리 채택되고 있습니다—하지만 올바르게 사용할 때만 그렇습니다. 내부 작동 방식을 이해하면 보다 안전하고 확장 가능한 시스템을 설계하는 데 도움이 됩니다.

저는 지식을 향상하고 재능 있는 사람들과 교류하기 위해 학습 취미로 이 글을 시작했습니다. 피드백과 제안은 언제든 환영합니다.

Back to Blog

관련 글

더 보기 »

토큰 검증

개요 JWT를 검증하는 과정은 다음과 같습니다: 1. 토큰 문자열을 파싱합니다. 2. 헤더와 페이로드를 디코딩합니다. 3. 적절한 키를 사용하여 서명을 검증합니다.

실험적인 Hono auth npm 패키지

제가 만들고 있는 것은 개발자들이 일반적인 보일러플레이트인 login, register, JWT, email verification 등을 작성하지 않고도 앱에 바로 넣을 수 있는 auth 패키지입니다.