
쿠키에 JWT를 저장하고 클라이언트에 전달하면, 클라이언트와 서버 간의 모든 요청에서 해당 쿠키가 자동으로 요청 헤더에 포함된다.
이를 통해 서버는 각 요청에서 쿠키에 저장된 JWT를 확인하여 사용자를 인증하고 권한을 부여할 수 있습니다.
- 쿠키를 통해 JWT를 클라이언트에 저장하지 않고, 바로 JWT를 클라이언트에 전송하면 클라이언트가 다음 요청을 보낼 때 request header에는 해당 JWT가 없을 것입니다. 대신에, 클라이언트가 JWT를 request header에 추가하여 서버에게 전달해야 합니다. 보통 Bearer 토큰을 사용하여 JWT를 request header에 포함시킵니다.
- JWT를 쿠키에 저장하면 클라이언트가 요청을 보낼 때 매번 해당 쿠키가 자동으로 request header에 포함됩니다. 따라서 서버 측에서 테스트할 때 프론트엔드 코드 없이도 해당 쿠키가 포함된 요청을 보낼 수 있어서 쉽게 테스트할 수 있습니다.
- 그러나 JWT를 클라이언트에 직접 전송하면, 클라이언트는 매 요청마다 해당 JWT를 request header에 수동으로 추가해야 합니다. 이 경우에는 테스트하기 위해서는 클라이언트 코드가 필요하게 됩니다.
JWT를 쿠키에 저장하는 것은 쿠키에 JWT를 보관하는 것을 의미합니다
서버 측에서는 인증 미들웨어를 사용하여 req.headers.authorization을 통해 클라이언트가 전달한 JWT를 추출하고, 해당 JWT의 유효성을 확인하여 사용자를 인증합니다.
export default function authMiddleware(req, res, next) {
try {
const secretKey = process.env.SECRET_KEY;
const token = req.headers.authorization; // 헤더에서 토큰 추출
if (!token) {
return res.status(401).json({ errorMessage: "인증되지 않은 사용자입니다." });
}
const verifiedToken = jwt.verify(token, secretKey);
req.user = verifiedToken;
next();
} catch (error) {
return res.status(401).json({ errorMessage: "유효하지 않은 토큰입니다." });
}
}
router.post("/login", async (req, res, next) => {
try {
// ... 로그인 로직 (생략) ...
const token = jwt.sign(
{
userId: user.userId,
},
secretKey
);
return res.status(200).json({ userInfo: token }); // userInfo라는 이름으로 JWT 전달
} catch (err) {
next(err);
}
});