J-Plum
2025. 2. 14. 23:40
2025. 2. 14. 23:40
1. passport.js란?
- passport.js는 Node.js에서 인증을 처리하기 위한 미들웨어로, 다양한 인증 전략을 제공합니다.
인증을 처리하는 데 필요한 로직을 간단하게 구현할 수 있게 도와줍니다.
2. passport의 흐름
- 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"})
- 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가 전략의 생성자를 보고 자동으로 매칭해주기 떄문이라고 합니다.
- serializeUser 로 세션에 사용자 정보 저장하기
- 세션 관리의 필요성
- 로그인한 사용자의 정보를 세션에 저장하여, 사용자가 로그인을 유지하고 인증된 상태를 지속적으로 사용할 수 있도록 합니다.
- serializeUser의 역할과 사용법
- deserializeUser 를 이용해서 세션에서 사용자 정보 조회하기
- 세션을 통한 인증 유지
- 세션에 저장된 사용자 정보를 기반으로 인증된 상태를 유지합니다. 세션이 만료되거나 사용자가 로그아웃할때 까지 세션 정보를 참조합니다.
- deserializeUser의 역할과 사용법
3. 결론
- passport.js를 사용하면 전략을 등록하고 인증을 처리한 후, 세션을 이용해 인증된 사용자를 관리할 수 있습니다.
- 세션을 통해 인증을 유지하며 serializeUser , deserializeUser를 사용하여 사용자정보를 효율적으로 관리합니다.
- 전략 등록부터 인증까지의 전체 흐름
- 전략 등록(passport.use) -> 인증 요청(passport.authenticate) -> 세션 저장(serializeUser) -> 세션 조회 (deserializeUser) -> 인증유지