Passport는 Node.js 애플리케이션에서 사용자 인증을 간편하게 처리할 수 있도록 도와주는 미들웨어다. Express 프레임워크와 함께 사용되며, 다양한 전략(Strategy)을 제공하여 로컬 인증, OAuth, OpenID 등을 구현할 수 있다.
https://www.passportjs.org/tutorials/password/verify/
/ Strategy
Passport는 다양한 인증 전략을 제공한다. 각 전략은 특정한 인증 프로토콜을 구현하고 있다.
주로 사용되는 전략은 로컬전략(Local Strategy), OAuth, OpenID 등이 있다.
인증 프로토콜에 따라 사용자 인증을 처리하고 성공시에 사용자 정보를 제공한다.
로컬 전략의 경우 아이디와 비밀번호를 이용하여 인증을 수행한다.
/ Session
Passport는 세션을 지원하여 사용자의 로그인 상태를 유지한다.
사용자가 로그인하면 세션에 정보를 저장하고 각 요청에서 사용자를 식별한다.
https://expressjs.com/en/resources/middleware/session.html
설치
npm install express passport passport-local express-session
Passport 및 session설정
const express = require('express');
const passport = require('passport');
const session = require('express-session');
const app = express();
// express-session 미들웨어 설정
app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: true }));
// Passport 초기화 및 세션 사용 설정
app.use(passport.initialize());
app.use(passport.session());
secret key는 무작위 문자열을 사용하는 것이 일반적이다. 예측이 불가능하고 길이가 충분히 길어야 하므로 Node.js에서는 'crypto'모듈을 사용하여 문자열을 생성할 수 있다.
resave : 'false'로 설정하면 세션 데이터가 변경되지 않았더라도 세션을 강제로 저장하지 않는다.
saveUninitialized : 'true'로 설정하면 초기화되지 않은 세션도 저장소에 저장된다.
초기화되지 않은 세션이란 사용자가 로그인하지 않은 상태의 세션을 의미한다.
Passport Local 설정
Passport Local 전략은 사용자의 아이디와 비밀번호를 사용하여 인증을 수행하는 전략이다.
const User = require('./models/User'); // 사용자 모델
passport.use(new LocalStrategy(
{
usernameField: 'username', // 사용자가 입력한 아이디 필드 이름
passwordField: 'password', // 사용자가 입력한 비밀번호 필드 이름
},
async (username, password, done) => {
try {
// 여기서 사용자를 데이터베이스에서 찾아와서 검증하고 처리
const user = await User.findOne({ username });
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.verifyPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user); // 사용자가 인증되었을 때
} catch (err) {
return done(err);
}
}
));
serializeUser 및 deserializeUser설정
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser(async (id, done) => {
try {
const user = await User.findById(id);
done(null, user);
} catch (err) {
done(err);
}
});
serializeUser
사용자 객체를 세션에 저장할 때 호출되며 사용자 객체에서 유일한 식별자를 추출한다.
deserializeUser
요청이 올 때마다 세션에 저장된 사용자 식별자를 기반으로 사용자 객체를 가져온다.
인증된 사용자 확인 (isAuthenticated)
isAuthenticated함수는 Express 미들웨어로 현재 요청된 경로에 대한 사용자의 인증 상태를 확인한다.
// 미들웨어: 인증된 사용자 확인
function isAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login');
}
req.isAuthenticated()
Passport가 제공하는 메서드로, 현재 사용자가 인증되었는지 여부를 확인한다.
만약 사용자가 인증되어 있다면 다음 미들웨어로 진행하고, 그렇지 않으면 로그인 페이지로 리다이렉트한다.
이 미들웨어는 로그인한 사용자만이 특정 경로에 접근할 수 있도록 보장한다.
라우터에서 Passport 사용
// 로그인 라우트
app.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true, // 실패 메시지를 사용하려면 이 옵션을 활성화
}));
passport.authenticate('local', ...)은 Local 전략을 사용해 사용자를 인증한다.
'STUDY > ExpressJS' 카테고리의 다른 글
[3-3] 요청과 응답(req, res) methods (0) | 2023.12.22 |
---|---|
[7-2] http의 취약점인 보안 강화를 위한 https (1) | 2023.12.06 |
[4-2] Express에서 정적 파일들을 제공하기 위한 미들웨어 - static (0) | 2023.05.24 |
[7-3] Express.js HTTP 보안강화 미들웨어 - helmet (0) | 2023.04.11 |
[5-3] Express.js 라우터 모듈화 (0) | 2023.04.05 |