2025. 3. 11. 23:18ㆍ백엔드/NODE.JS
Passport란 무엇인가?
Passport는 Node.js 애플리케이션에서 사용자 인증(Authentication)을 간편하게 구현할 수 있도록 도와주는 경량 미들웨어입니다. 공식 문서에서는 "Extremely simple, unobtrusive authentication"이라고 설명하며, 다양한 인증 전략(Strategy)을 플러그인 형태로 손쉽게 추가할 수 있도록 설계되어 있습니다.
Passport의 주요 특징
- 경량성 및 유연성:
Passport는 코어 기능만 제공하며, 필요한 인증 방식은 별도의 전략 모듈(예: Local, OAuth, JWT 등)로 확장합니다. 이를 통해 애플리케이션에 맞는 인증 방법을 자유롭게 선택할 수 있습니다. - 비침투적 디자인:
기존의 Express 애플리케이션과 쉽게 통합할 수 있으며, 인증 로직을 애플리케이션의 다른 부분과 분리하여 관리할 수 있습니다. - 다양한 전략 지원:
Passport는 Facebook, Google, Kakao와 같은 외부 제공자의 OAuth 인증부터, 기본적인 사용자명/비밀번호 인증(Local Strategy) 등 여러 인증 방식을 지원합니다.
Passport 설치 및 Express와의 통합
먼저, Passport를 npm을 통해 설치합니다.
npm install passport
그리고 Express 애플리케이션에 Passport를 통합합니다. 기본 설정은 다음과 같습니다.
const express = require("express");
const passport = require("passport");
const app = express();
// Passport 초기화
app.use(passport.initialize());
// 세션을 사용하는 경우 (예: 로그인 상태 유지)
app.use(passport.session());
- passport.initialize():
이 미들웨어는 요청(req) 객체에 인증 관련 메서드와 속성을 추가합니다. - passport.session():
Express 세션 미들웨어와 함께 사용되어, 사용자가 로그인한 상태를 유지할 수 있도록 사용자 정보를 직렬화(serialize) 및 역직렬화(deserialize)합니다.
인증 전략(Strategies)
Passport는 **전략(Strategy)**라는 개념을 도입하여, 각 인증 방식별로 별도의 모듈을 사용합니다. 몇 가지 예시는 다음과 같습니다.
1. Local Strategy
사용자명과 비밀번호를 이용한 기본 인증 방식입니다.
const LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function(username, password, done) {
// 사용자 조회 및 비밀번호 검증 로직 구현
}
));
2. OAuth 전략 (예: Kakao Strategy)
외부 제공자의 OAuth 인증을 사용하는 방식입니다.
const KakaoStrategy = require('passport-kakao').Strategy;
passport.use(new KakaoStrategy({
clientID: process.env.KAKAO_CLIENT_ID,
callbackURL: "/auth/kakao/callback"
},
function(accessToken, refreshToken, profile, done) {
// 카카오 프로필 정보로 사용자 인증 로직 구현
}
));
각 전략은 고유의 옵션과 verify callback 함수를 가지며, 인증 성공 시 done(null, user) 형태로 사용자 정보를 반환합니다.
인증 프로세스 및 미들웨어 활용
Passport는 Express 라우터에서 passport.authenticate() 미들웨어를 사용하여 인증을 수행합니다. 예를 들어, 카카오 로그인을 처리하는 코드는 다음과 같습니다.
// 카카오 로그인 요청
router.get("/kakao", passport.authenticate("kakao"));
// 카카오 로그인 콜백 처리
router.get(
"/kakao/callback",
passport.authenticate("kakao", { failureRedirect: "/login-fail" }),
(req, res) => {
// 인증 성공 후 처리: JWT 발급, 쿠키 설정, 리다이렉션 등
const { token, isFirstLogin } = req.user;
const FRONTEND_URL = process.env.FRONTEND_URL || "http://localhost:5173";
res.cookie("accessToken", token, {
httpOnly: true, // 보안을 위해 실제 배포 시 true로 설정하는 것이 좋습니다.
secure: false, // HTTPS 배포 환경에서는 true로 설정
sameSite: "lax", // CSRF 공격 방지
maxAge: 60 * 60 * 1000,
});
res.redirect(`${FRONTEND_URL}?isFirstLogin=${isFirstLogin}`);
}
);
- passport.authenticate("kakao")
이 함수는 Passport에 설정된 카카오 인증 전략을 실행하여, 사용자를 카카오 로그인 페이지로 리다이렉트시킵니다.
인증 후 카카오에서 콜백 URL로 리다이렉트하면, 다시 passport.authenticate()가 호출되어 인증 결과를 처리합니다.
세션과 Passport: 직렬화와 역직렬화
세션 기반 인증을 사용할 경우, Passport는 로그인한 사용자 정보를 세션에 저장하기 위해 두 가지 함수를 사용합니다.
1. serializeUser
로그인 성공 시, 사용자 객체를 세션에 저장할 식별자로 변환합니다.
passport.serializeUser((user, done) => {
done(null, user.id);
});
2. deserializeUser
이후의 요청마다 세션에 저장된 식별자를 기반으로 사용자 객체를 복원합니다.
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
세션을 사용하지 않는 경우(예: JWT 기반 인증)에는 이 과정이 생략됩니다.
참고 자료
- Passport 공식 문서
다양한 인증 전략과 구현 예제, 설정 방법 등을 자세하게 다룹니다. - Passport GitHub 저장소
최신 업데이트와 커뮤니티 기여 내용을 확인할 수 있습니다.
마치며
Passport는 Node.js 애플리케이션에서 강력하면서도 유연한 인증 기능을 제공하는 도구입니다. 다양한 전략을 통해 소셜 로그인부터 기본 로그인 방식까지 손쉽게 구현할 수 있으며, Express와의 통합도 매우 간단합니다.
티스토리 블로그에 이 내용을 올리면, Node.js와 인증 시스템에 관심 있는 독자들에게 유익한 정보를 제공할 수 있을 것입니다.
이 글이 티스토리 포스트 작성에 도움이 되길 바랍니다. 추가 질문이나 보충할 내용이 있다면 언제든지 댓글이나 문의 부탁드립니다!
'백엔드 > NODE.JS' 카테고리의 다른 글
| 등록 API, (0) | 2025.03.13 |
|---|---|
| 서버 URL 및 엔드포인트 (0) | 2025.03.13 |
| $ne와 $nin (0) | 2025.03.11 |
| node.js 카카오 로그인 (0) | 2025.03.11 |
| 1. Node.js 모듈 시스템 개요 (0) | 2025.03.11 |