Node.js에서 JWT를 사용한 인증 방법
Source: Dev.to

JWT란?
JWT (JSON Web Token) 은 파티 간에 정보를 안전하게 전송하기 위해 사용되는 작고 URL‑안전한 토큰입니다.
JWT는 다음과 같은 형태입니다:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
세 부분으로 구성됩니다:
HEADER.PAYLOAD.SIGNATURE
JWT 구조
Header
토큰 타입과 서명 알고리즘을 포함합니다.
{
"alg": "HS256",
"typ": "JWT"
}
Payload
사용자 데이터(클레임)를 포함합니다.
{
"id": 42,
"email": "user@example.com"
}
⚠️ 절대 비밀번호나 기타 민감한 데이터를 페이로드에 저장하지 마세요.
Signature
토큰이 변조되지 않았는지 검증하는 데 사용됩니다.
HMACSHA256(base64UrlHeader + "." + base64UrlPayload, secret)
JWT 인증 작동 방식
- 사용자가 이메일 & 비밀번호로 로그인합니다.
- 서버가 자격 증명을 확인합니다.
- 서버가 JWT를 생성합니다.
- 클라이언트가 JWT를 저장합니다(보통 메모리나 HTTP‑only 쿠키).
- 클라이언트가
Authorization헤더에 JWT를 포함해 보냅니다. - 서버가 모든 요청에서 JWT를 검증합니다.
Node.js(Express)에서 JWT 인증 구현하기
의존성 설치
npm install express auth-verify
로그인 시 JWT 생성(서명)
const AuthVerify = require('auth-verify');
const auth = new AuthVerify({
jwtSecret: "SUPER_SECRET" // JWT 서명을 위한 비밀키
});
// 1시간 뒤에 만료되는 JWT 생성
auth.jwt.sign({ userId: 1, user: "John Doe" }, "1h");
로그인 라우트 예시
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
const AuthVerify = require('auth-verify');
const auth = new AuthVerify({ jwtSecret: "SUPER_SECRET" });
app.post('/login', async (req, res) => {
const { email, password } = req.body;
const user = await findUserByEmail(email);
if (!user) return res.status(401).json({ message: 'Invalid credentials' });
const isValid = await auth.crypto.verify(password, user.password);
if (!isValid) return res.status(401).json({ message: 'Invalid credentials' });
const token = await auth.jwt.sign({ userId: user.id, user: user.name }, "1h");
res.json({ token });
});
JWT 미들웨어로 라우트 보호하기
auth.jwt.protect(); // Express 미들웨어 반환
보호된 라우트 예시
app.get('/profile', auth.jwt.protect(), (req, res) => {
res.json({
message: 'Welcome!',
user: req.user
});
});
클라이언트에서 JWT 전송하기
Authorization: Bearer YOUR_JWT_TOKEN
흔히 저지르는 JWT 실수
- ❌
localStorage에 JWT 저장 (XSS 위험) - ❌ 페이로드에 민감한 데이터 삽입
- ❌ 토큰 만료 시간 설정 안 함
- ❌ 약한 비밀키 사용
베스트 프랙티스
- ✅ 가능하면 HTTP‑only 쿠키 사용
- ✅ 항상
expiresIn(또는exp클레임) 설정 - ✅ 프로덕션에서는 비밀키를 주기적으로 교체
언제 JWT를 사용해야 할까?
적합한 경우:
- 무상태 API
- 마이크로서비스 아키텍처
- 모바일 또는 SPA 인증
부적합한 경우:
- 모든 클라이언트에서 즉시 로그아웃이 필요할 때
- 복잡한 세션 관리가 필요할 때
결론
JWT는 인증을 처리하는 간단하고 확장 가능하며 무상태적인 방법을 제공합니다.
올바르게 사용한다면 강력하고 안전합니다. API, SPA, 모바일 앱을 구축한다면 JWT를 숙달할 가치가 있습니다.