JWT는 당사자 간에 정보를 JSON 객체로 안전하게 전송하기 위한 독립적인 방식을 정의하는 표준입니다. 이 정보는 디지털 서명이 되어 있으므로 신뢰할 수 있습니다.
JWT는 세 부분으로 구성되며, 각각 점(.)으로 구분됩니다:
xxxxx.yyyyy.zzzzz
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "홍길동",
"iat": 1516239022,
"exp": 1516239022
}
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret);
sequenceDiagram
Client->>Server: 로그인 요청
Server->>Server: 사용자 인증
Server->>Client: JWT 토큰 발급
Client->>Server: 요청 + JWT
Server->>Server: JWT 검증
Server->>Client: 응답
import jwt from "jsonwebtoken";
const generateToken = (user: User) => {
return jwt.sign(
{
id: user.id,
email: user.email
},
process.env.JWT_SECRET!,
{ expiresIn: "1h" }
);
};
import { Request, Response, NextFunction } from "express";
import jwt from "jsonwebtoken";
const authMiddleware = (req: Request, res: Response, next: NextFunction) => {
try {
const token = req.headers.authorization?.split(" ")[1];
if (!token) {
return res.status(401).json({ message: "인증 토큰이 없습니다." });
}
const decoded = jwt.verify(token, process.env.JWT_SECRET!);
req.user = decoded;
next();
} catch (error) {
return res.status(401).json({ message: "유효하지 않은 토큰입니다." });
}
};
interface Tokens {
accessToken: string;
refreshToken: string;
}
const generateTokens = (user: User): Tokens => {
const accessToken = jwt.sign({ id: user.id }, process.env.JWT_SECRET!, {
expiresIn: "15m"
});
const refreshToken = jwt.sign({ id: user.id }, process.env.REFRESH_SECRET!, {
expiresIn: "7d"
});
return { accessToken, refreshToken };
};
// 프론트엔드 (안전한 저장)
const storeTokens = (tokens: Tokens) => {
// Access Token은 메모리에 저장
setAccessToken(tokens.accessToken);
// Refresh Token은 HttpOnly 쿠키에 저장
document.cookie = `refreshToken=${tokens.refreshToken}; path=/; HttpOnly; Secure`;
};
// .env
JWT_SECRET = your - 256 - bit - secret;
REFRESH_SECRET = your - different - 256 - bit - secret;
// config.ts
export const config = {
jwt: {
secret: process.env.JWT_SECRET!,
refreshSecret: process.env.REFRESH_SECRET!,
accessExpiresIn: "15m",
refreshExpiresIn: "7d"
}
};
이러한 JWT 구현은 현대 웹 애플리케이션에서 널리 사용되는 인증 방식이며, 적절한 보안 조치와 함께 사용하면 안전하고 효율적인 인증 시스템을 구축할 수 있습니다.