1. passport.js란?

  • passport.js는 Node.js에서 인증을 처리하기 위한 미들웨어로, 다양한 인증 전략을 제공합니다.
    인증을 처리하는 데 필요한 로직을 간단하게 구현할 수 있게 도와줍니다.

2. passport의 흐름

  1. passport.use로 전략 등록하기
    • 인증 전략의 개념 
      • 인증 전략은 사용자가 시스템에 접근하기 위한 인증방법을 정의하는 것 입니다.
        예를들어, 로컬 로그인, 카카오 로그인, 구글 로그인 등이 전략으로 제공됩니다.
    • passport.use 사용법
      • passport.use() 메서드는 인증 전략을 등록하는 함수입니다.
        등록된 전략은 이후 passport.authenticate()로 호출해 사용합니다.
    • 예시
      passport.use(
        new LocalStrategy(
          {
            usernameField: 'email', // 로그인 시 사용할 필드
            passwordField: 'password',
          },
          async (email, password, done) => {
            const user = await User.findOne({ where: { email } });
      	  //유져가 있고, password 와 user.password가 같다면
            if (user && bcrypt.compareSync(password, user.password)) {
              return done(null, user);
            } else {
              return done(null, false, { message: 'Invalid credentials' });
            }
          }
        )
      );

      인자값에 대해 정리를 해보자면,
      1. passport.use(strategy(option, callback));
       - strategy : 사용하고자 하는 인증 전략 (ex : LocalStrategy)
       - option : 전략에 필요한 옵션 설정 (ex : usernameField, passwordFiend, passReqToCallback)
       - callback : 인증을 처리하는 함수, 이 함수에서 done을 호출하여 인증결과를 반환합니다.

      2. callback(username, password, done);  , done(error, user|false, options?)
       - error : 인증 중에 발생한 에러 (에러가 발생하지않으면 null 또는 undefined
       - user : 인증 성공시 인증된 사용자 객체 (없으면 false)
       - options : 인증 실패 시 추가적인 정보 (ex {message : "Invalid credentials"})
  2. passport.authenticate로 인증 요청하기
    • 인증 요청의 과정
      • 사용자가 로그인 폼 형식에 맞춰 제출하면 passport.authenticate가 호출되고, 해당 전략에 맞는 인증 과정이 시작됩니다.
    • passport.authenticate 와 전략 선택
      • passport.authenticate("local")에서 "local"은 등록된 전략의 이름입니다.
      • local 전략이 사용되며 그에 맞는 인증 로직이 실행됩니다.
      • local 의 경우 passport-local 의 LocalStrategy를  kakao의 경우 passport-kakao 입니다.
        passport.authenticate("local") 은  passport.use( new LocalStrategy()) 을 실행
        passport.authenticate("kakao") 은  passport.use( new KakaoStrategy()) 을 실행

      • 저는 여기서 의문이 생겼습니다. authenticate에서 "local"은 어떻게 passport.use( new LocalStrategy())를 찾고 실행하는가 였습니다.
        passport.use("kakao", new KakaoStrategy(...)) , passport.use("local", new LocalStrategy (...)) 처럼
        "kakao"  "local 을 명시적으로 붙이지 않아도, 내부적으로 passport가 전략의 생성자를 보고 자동으로 매칭해주기 떄문이라고 합니다.
  3. serializeUser 로 세션에 사용자 정보 저장하기
    • 세션 관리의 필요성
      • 로그인한 사용자의 정보를 세션에 저장하여, 사용자가 로그인을 유지하고 인증된 상태를 지속적으로 사용할 수 있도록 합니다.
    • serializeUser의 역할과 사용법
      • serializeUser 는 로그인 한 사용자 정보를 세션에 저장할 떄 사용합니다. 
      • 보통 사용자 id만 저장하며, 이 정보는 deserializeUser 에서 사용합니다.
      • passport.serializeUser((user, done) => {
          done(null, user.id); // 사용자 정보를 세션에 저장
        });
        passport.use 에서의 callback이 가지고 있는 done과 흡사합니다.
        passport.use는 인증 시도 및 실패 처리가 이뤄지는 반면  serializeUser 에서는 인증이 성공한 후에 세션에 저장하는 과정이므로 실패 관련 정보가 없습니다.
        그렇기 때문에  user | false , option 이 없습니다.
  4. deserializeUser 를 이용해서 세션에서 사용자 정보 조회하기
    • 세션을 통한 인증 유지
      • 세션에 저장된 사용자 정보를 기반으로 인증된 상태를 유지합니다. 세션이 만료되거나 사용자가 로그아웃할때  까지 세션 정보를 참조합니다.
    • deserializeUser의 역할과 사용법
      • deserializeUser는 serializeUser를 통해 저장된 사용자 ID를 조회하여 실제 사용자 정보를 데이터베이스에서 가져옵니다. 로그인 후 매 요청시마다 호출되어 사용자 정보를 불러옵니다.
      • passport.deserializeUser((id, done) => {
            User.findOne({ where: { id } })
              .then((user) => done(null, user))
              .catch((err) => done(err));
          });


3. 결론

  • passport.js를 사용하면 전략을 등록하고 인증을 처리한 후, 세션을 이용해 인증된 사용자를 관리할 수 있습니다.
    • 세션을 통해 인증을 유지하며 serializeUser , deserializeUser를 사용하여 사용자정보를 효율적으로 관리합니다.
  • 전략 등록부터 인증까지의 전체 흐름
    • 전략 등록(passport.use)  -> 인증 요청(passport.authenticate) -> 세션 저장(serializeUser) -> 세션 조회 (deserializeUser) -> 인증유지

'Node js' 카테고리의 다른 글

파일 업로드 처리 (Multer)  (0) 2025.02.17
mongoDB 에 대하여  (1) 2025.01.25
3. express 미들웨어 정리하기  (2) 2025.01.24
2. 노드의 특성  (0) 2025.01.07
1. Node.js 란?  (0) 2025.01.07

+ Recent posts