Passport

2025. 3. 11. 23:18백엔드/NODE.JS

728x90

 

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는 Node.js 애플리케이션에서 강력하면서도 유연한 인증 기능을 제공하는 도구입니다. 다양한 전략을 통해 소셜 로그인부터 기본 로그인 방식까지 손쉽게 구현할 수 있으며, Express와의 통합도 매우 간단합니다.
티스토리 블로그에 이 내용을 올리면, Node.js와 인증 시스템에 관심 있는 독자들에게 유익한 정보를 제공할 수 있을 것입니다.


이 글이 티스토리 포스트 작성에 도움이 되길 바랍니다. 추가 질문이나 보충할 내용이 있다면 언제든지 댓글이나 문의 부탁드립니다!

728x90

'백엔드 > 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