## Passport 는 Node.js에서 사용되는 인증 미들웨어
인증 : 사용자의 신원을 확인함
## Passport의 역할
- 웹 어플리케이션에서 로그인 기능을 구현하려면 보통 사용자 정보를 저장하고, 사용자가 입력한 정보 ( 이름이나 비밀번호 예를 들어 )가 맞는지 확인해야 한다. 이 과정을 인증이라고 하고, Passport는 그 과정을 쉽게 만들어준다.
- Passport를 사용하면 소셜 로그인도 쉽게 구현할 수 있음.
- 여러가지 전략이 있는데 로컬 로그인이 가장 기본이 된다.
- 크게 3가지 전략이 있는데
1. LocalStrategy : 사용자 이름/비밀번호
2. GoogleStrategy : 구글계정
3. JWTStrategy : jwt 토큰
각 전략은 인증하는 방식만 다르고, Passport의 역할은 이 전략들을 통합해서 인증을 처리하는 것.
## 세션
- 사용자가 로그인하면 세션을 통해서 로그인 상태를 유지함. Passport는 세션을 관리하는 기능도 제공함.
- 로그인한 후에는 매번 로그인할 필요없이 세션에 저장된 정보를 바탕으로 자동으로 인증을 처리함.
## 사용법
1. 설치 Passport와 필요한 전략들을 설치함
npm install passport passport-local express-session
2. 초기화 : Express 앱에서 passport를 초기화하고 세션을 설정
const express = require('express');
const passport = require('passport');
const session = require('express-session');
const LocalStrategy = require('passport-local').Strategy;
const app = express();
// 세션 설정
app.use(session({
secret: 'your_secret_key', // 세션 암호화 키
resave: false,
saveUninitialized: false,
}));
// passport 초기화
app.use(passport.initialize());
app.use(passport.session());
3. 전략 설정
- 사용자가 로그인할 때 어떻게 인증할지 정의하는 전략을 설정한다.
- 예를 들어서 LocalStrategy를 사용해서 사용자 이름과 비밀번호를 체크하는 방법을 설정할 수 있음.
passport.use(new LocalStrategy((username, password, done) =>{
const user = { id : 1, username : 'admin', password : 'password' };
// 예시 사용자 정보
if( username === user.username && password === user.password ){
return done(null, user); // 인증성공
}else{
return done(null, false, {message:'Invalid Credentials'}); // 인증실패
}
} ));
4. 세션에 사용자 정보를 저장
- 로그인 후 사용자 정보를 세션에 저장하는 방법을 정의해야한다.
- 보통 사용자 id만 저장하고, 실제 사용자 정보를 복원할 때 deserializeUser() 를 사용해서 db에서 다시 정보를 찾는다.
passport.serializeUser(( user,done ) => {
done(null, user.id); // 세션에 저장할 정보는 보통 사용자 id만
});
passport.deserializeUser((id, done) =>{
const user = {id : 1, username : 'admin'};
done(null, user);
})
* 보충 설명
passport에서 말하는 세션은 클라이언트의 브라우저 세션 스토리지와는 조금 다르고, 서버 측 세션을 의미한다.
서버 측 세션은 사용자가 로그인한 후에 그 사용자에 대한 상태 정보를 서버에서 관리하는 방식이다.
즉, 사용자가 로그인하면 서버에서 해당 사용자 정보를 세션에 저장하고, 사용자가 요청을 보낼 때마다 그 정보를 서버에서 가져와서 인증상태를 확인하는 것이다.
여기서 세션은 클라이언트의 브라우저 쿠키에 저장되는 세션 id만 저장되고, 실제 사용자 정보는 서버에 저장된다. 세션 id를 통해 서버는 클라이언트가 누구인지를 추적하고, 해당 사용자에 대한 정보를 세션에서 찾아오는 방식이다.
* 세션과 세션 id의 흐름
1. 사용자가 로그인하면, passport는 사용자의 정보를 세션에 저장한다. 여기서 말하는 세션은 서버 메모리나 다른 저장소에 저장되는 것이고, 사용자의 정보는 세션에 저장된 값으로 관리된다.
2. 서버는 세션 id를 생성하고, 이 세션 id를 클라이언트의 브라우저 쿠키에 저장한다. 이 쿠키는 이후에 사용자가 요청을 보낼 때마다 함께 서버로 전송된다.
3. 사용자가 웹사이트를 다시 방문하면, 브라우저의 쿠키에 있는 세션 id를 통해 서버는 해당 사용자 정보를 찾아서, 그에 맞는 인증 상태를 유지한다.
* 실제 코드에서 어떻게 돌아가는가?
serializeUser()와 deserializeUser() 함수에서의 세션 처리 흐름을 보겠다.
1. serializeUser()
- 사용자가 로그인하고 나면, 서버는 사용자 정보를 세션에 저장할 때, 일반적으로 사용자 id만 저장한다.
- 이 id 는 세션에 저장된 고유 값으로, 클라이언트가 보낸 세션 id를 통해 서버가 사용자를 추적할 수 있게 한다.
passport.serializeUser(function(user,done){
done(null, user.id); // 사용자 정보 중 id만 세션에 저장
})
- 여기에서 user.id만 세션에 저장되는데, 이 정보는 서버 메모리나 서버의 세션 저장소 ( 예를 들어, redis나 데이터베이스 ) 에 저장된다.
2. deserializeUser()
- 클라이언트가 다시 요청을 보낼 때, 서버는 세션 id를 통해 서버에 저장된 사용자 정보를 불러온다. 그 후에 세션에 저장된 사용자 정보를 deserializeUser() 함수에서 복원한다.
passport.deserializeUser(function(id, done){
// 서버 측에서 id를 바탕으로 사용자 정보를 찾고 복원
const user = { id : 1, username : 'admin' }; // 예시로 고정된 사용자
done(null, user);
});
여기서 id는 클라이언트 쿠키에 저장된 세션 id를 통해 서버가 추적할 수 있는 사용자 id고, 이를 통해서 사용자의 정보를 db나 다른 저장소에서 가져오는 방식이다.
5. 로그인 라우터 설정
- 사용자가 로그인할 때 이 인증을 처리해주는 라우터를 지정해야한다.
app.post('/login', passport.authenticate('local', {
successRedirect: '/', // 인증 성공 후 이동할 경로
failureRedirect: '/login', // 인증 실패 후 이동할 경로
}));
6. 보호된 페이지 만들기
- 인증된 사용자만 접근할 수 있는 페이지를 만들 때, req.isAuthenticated()를 사용해서 로그인 상태를 알 수 있다.
'Backend > Node.js' 카테고리의 다른 글
[Express] 정리 (1) (0) | 2025.04.10 |
---|