JWT 인증 구현 완벽 가이드 - Node.js와 Spring Boot 실전 예제로 배우기
현대 웹 애플리케이션에서 JWT(JSON Web Token)는 사실상 표준 인증 방식이 됐어요. 특히 MSA 환경이나 모바일 앱에서 stateless한 인증이 필요할 때 JWT만한 게 없죠.
JWT가 세션 방식보다 나은 이유
전통적인 세션 인증은 서버 메모리에 사용자 정보를 저장해요. 하지만 서버가 여러 대일 때 세션 동기화 문제가 발생하죠. JWT는 토큰 자체에 사용자 정보를 담아서 보내기 때문에 서버는 상태를 저장할 필요가 없어요.
JWT는 Header, Payload, Signature 세 부분으로 구성돼요. Payload에 사용자 ID나 권한 정보를 넣고, 서버의 비밀키로 서명해서 위변조를 방지합니다. 클라이언트는 매 요청마다 이 토큰을 Authorization 헤더에 담아 보내면 돼요.
Access Token과 Refresh Token 이중 토큰 전략
보안을 위해 Access Token은 짧은 만료시간(15분), Refresh Token은 긴 만료시간(7일)으로 설정하는 게 일반적이에요. Access Token이 만료되면 Refresh Token으로 새로 발급받는 구조죠.
// Node.js Express 예제
const jwt = require('jsonwebtoken');
function generateTokens(userId) {
const accessToken = jwt.sign(
{ userId, type: 'access' },
process.env.ACCESS_SECRET,
{ expiresIn: '15m' }
);
const refreshToken = jwt.sign(
{ userId, type: 'refresh' },
process.env.REFRESH_SECRET,
{ expiresIn: '7d' }
);
return { accessToken, refreshToken };
}
Refresh Token은 DB에 저장해서 관리하는 게 좋아요. 사용자가 로그아웃하거나 보안 문제가 생기면 해당 토큰을 무효화할 수 있거든요.
JWT 검증 미들웨어 구현하기
모든 인증이 필요한 API 요청마다 토큰을 검증해야 해요. 미들웨어 패턴으로 구현하면 코드 재사용성이 좋아집니다.
// JWT 검증 미들웨어
const authMiddleware = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({ message: '토큰이 없습니다' });
}
try {
const decoded = jwt.verify(token, process.env.ACCESS_SECRET);
req.userId = decoded.userId;
next();
} catch (error) {
return res.status(401).json({ message: '유효하지 않은 토큰입니다' });
}
};
JWT 보안 취약점과 대응 방법
JWT를 사용할 때 가장 주의해야 할 점은 XSS(Cross-Site Scripting) 공격이에요. 토큰을 localStorage에 저장하면 악성 스크립트로 쉽게 탈취당할 수 있거든요.
가장 안전한 방법은 HttpOnly 쿠키에 저장하는 거예요. JavaScript로 접근할 수 없어서 XSS 공격을 막을 수 있죠. 추가로 Secure 플래그를 설정하면 HTTPS에서만 전송돼요. CSRF 토큰을 함께 사용하면 CSRF 공격도 방어할 수 있습니다.
또 다른 중요한 점은 비밀키 관리예요. 환경변수로 관리하고, 충분히 긴 랜덤 문자열을 사용해야 해요. 절대 코드에 하드코딩하면 안 됩니다.
주의사항: Payload는 Base64로 인코딩만 될 뿐 암호화되지 않아요. 민감한 정보(비밀번호, 개인정보)는 절대 넣으면 안 됩니다. 사용자 식별자와 최소한의 권한 정보만 담으세요.
결론
JWT 인증은 stateless한 특성 덕분에 확장성이 뛰어나지만, 올바른 보안 전략이 필수예요. Access/Refresh Token 이중 구조로 보안을 강화하고, HttpOnly 쿠키로 저장하며, Payload에는 최소 정보만 담는 게 핵심입니다. 이 가이드를 바탕으로 안전한 JWT 인증 시스템을 구축해보세요!
'인증|사용자 관리' 카테고리의 다른 글
| OAuth 2.0 동작 원리 완벽 정리 - 10분만에 이해하는 소셜 로그인 인증 구조 (1) | 2026.03.12 |
|---|