티스토리 뷰
사용자 인증 미들웨어를 사용하는 이유
1. 클라이언트로부터 전달받은 쿠키를 검증하는 작업을 수행
2. 클라이언트의 요청이 인증되었는지 확인함으로써 애플리케이션의 보안을 강화
3. 특정 엔드포인트나 리소스에 대한 접근을 제어하기 위해 사용자의 인증 상태를 확인
4. 토큰의 유효성을 확인하고, 만료된 토큰이나 조작된 토큰에 대한 처리를 수행
커스텀 비즈니스 로직
1. 클라이언트로부터 쿠키를 전달받음
2. 쿠키가 Bearer 토큰 형식인지 확인
3. 서버에서 발급한 JWT가 맞는지 검증
4. JWT의 유저ID를 이용하여 사용자를 조회
5. req.user에 조회된 사용자 정보를 할당
6. 다음 미들웨어를 실행
• 클라이언트가 전달한 쿠키를 바탕으로 사용자를 검증
• 토큰이 만료되진않았느지, 토큰의 형식은 일치하늕지, 서버가 발급한 토큰이 맞는지의 검증을 수행하여
사용자의 권한을 확인
• JWT를 통해 사용자를 인증하는 것을 인증(Authentication)이라 함.
• 클라이언트는 인증 과정을 전부 통과하였을 때에만 로그인된 사용자만 사용할 수 있는 게시글 작성과 같은 권한이 필요한 API를 사용할 수 있게 되는데 이 권한을 확인하는 과정을 인가(Authorization)과정 이라고 함. (미구현)
// src/middlewares/auth.middleware.js // 사용자 인증 미들웨어
import jwt from "jsonwebtoken";
import { prisma } from "../until/prisma/index.js";
export default async function (req, res, next) {
try {
console.log("인증토큰 들어옴");
const { authorization } = req.cookies;
if (!authorization) throw new Error("토큰이 존재하지 않습니다.");
const [tokenType, token] = authorization.split(" ");
if (tokenType !== "Bearer")
throw new Error("토큰 타입이 일치하지 않습니다.");
const decodedToken = jwt.verify(token, "custom-secret-key");
const userId = decodedToken.userId;
const user = await prisma.users.findFirst({
where: { userId: +userId },
});
if (!user) {
res.clearCookie("authorization");
throw new Error("토큰 사용자가 존재하지 않습니다.");
}
// req.user에 사용자 정보를 저장합니다.
req.user = user;
next();
} catch (error) {
res.clearCookie("authorization");
// 토큰이 만료되었거나, 조작되었을 때, 에러 메시지를 다르게 출력합니다.
switch (error.name) {
case "TokenExpiredError":
return res.status(401).json({ message: "토큰이 만료되었습니다." });
case "JsonWebTokenError":
return res.status(401).json({ message: "토큰이 조작되었습니다." });
default:
return res
.status(401)
.json({ message: error.message ?? "비정상적인 요청입니다." });
}
}
}
이렇게 하고 사용하려는 라우터에서 api를 진행할 떄
router.post("/api/login" , authMiddleware,(req,res)=>({}) 이렇게 인증을 진행한후 요청을 처리하고 응답하면 됩니다.
'프로그래밍 기초 > CS' 카테고리의 다른 글
JWT란? (0) | 2024.02.14 |
---|---|
쿠키(Cookie)와 세션(Session) (0) | 2024.02.13 |
REST API란? (0) | 2024.01.23 |
웹서버란? (0) | 2024.01.18 |
웹과 HTTP (0) | 2024.01.17 |