티스토리 뷰
passort
- passport는 Node.js에서 인증을 관리하기 위한 미들웨어로, Express와 함께 사용하기에 용이합니다
- Express 애플리케이션에 passport를 적용하면, 요청을 처리하기 전에 passport가 인증 과정을 수행하고, 인증된 사용자 정보를 요청 객체(request object)에 저장합니다.
- 이렇게 저장된 사용자 정보는 라우트 핸들러에서 사용되어 로그인 상태를 확인하거나 인증된 사용자만 접근 가능한 기능을 구현하는 데 활용될 수 있습니다.
passort 세팅
npm install passport passport-local
- 먼저 npm으로 passport를 설치합니다. passport-local는 로컬환경에서 인증하기 위한 라이브러리입니다.
- 그 후, 서버에 다음과 같은 초기 설정을 합니다.
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
app.use(passport.initialize());
app.use(passport.session());
- passport.initialize()은 Passport 미들웨어의 초기화 함수로, Express 애플리케이션에서 Passport를 초기 단계에서 설정들을 초기화시킵니다.
- passport.session()은 passport.initialize() 함수 뒤에 호출되며, Passport 미들웨어의 세션 관리 기능을 활성화하는 함수입니다.
- passport.session() 함수를 호출하면 요청 객체의 req.session 속성을 통해 세션 데이터에 액세스할 수 있게 됩니다.
로컬 환경에서 인증 코드 예제
passport.use(new LocalStrategy({
usernameField: 'id',
passwordField: 'pw',
session: true,
passReqToCallback: false,
}, function (입력한아이디, 입력한비번, done) {
db.collection('login').findOne({ id: 입력한아이디 }, function (에러, 결과) {
if (에러) return done(에러)
if (!결과) return done(null, false, { message: '존재하지않는 아이디요' })
if (입력한비번 == 결과.pw) {
return done(null, 결과)
} else {
return done(null, false, { message: '비번틀렸어요' })
}
})
}));
- 위의 코드는 일반적인 로컬 방식의 회원 인증 방법입니다. 세부적으로 살펴보자면...
passport.use( new LocalStrategy({
usernameField: 'id',//사용자가 제출한 아이디 이름
passwordField: 'pw',// 사용자가 제출한 비번 이름
session: true, //세션을 생성 여부
passReqToCallback: false,// 아이디/비번말고 다른 정보검사 필요 여부
});
- LocalStrategy()는 Passport의 로컬 전략(Local Strategy)을 구현하기 위한 함수로, 사용자의 아이디와 비밀번호를 사용하여 로컬 인증을 처리합니다.
- usernameField는 사용자가 제출한 아이디를 지정합니다. 예를 들어, 어떤 <input>인지 <input>의 name 속성값인지를 작성하면 됩니다.
- passwordField은 usernameField의 비밀번호 버전으로 동일하게 작동됩니다.
- session은세션을 생성여부입니다. 주로 자동 로그인에서 사용되는 설정입니다.
- passReqToCallback 부분은 사용자의 아이디/비번 말고도 다른 정보를 검사여부를 의미합니다. true라면 콜백함수의 첫번째 인자로 기타 정보들이 들어가는데 파라미터.body로 출력 가능합니다.
function (입력한아이디, 입력한비번, done) {
db.collection('login').findOne({ id: 입력한아이디 }, function (에러, 결과) {
if (에러) return done(에러)
if (!결과) return done(null, false, { message: '존재하지않는 아이디요' })
if (입력한비번 == 결과.pw) {
return done(null, 결과)
} else {
return done(null, false, { message: '비번틀렸어요' })
}
})
})
- 다음은 검증 결과에 따라 결과값이 달라지는 콜백함수 입니다.
- 특별한 코드는 없지만, 다만 done이라는 함수를 반환해야 합니다.
- done은 Passport의 인증 처리를 완료하고 결과를 전달하는 콜백 함수로, 사용자 인증 결과를 Passport에 알려주는 역할을 합니다.
done 함수는 error, user, info의 세 가지 매개변수를 가지고 있습니다.
- error: 에러가 발생한 경우 에러 객체를 전달합니다. 에러가 없을 경우 null을 전달합니다.
- user: 인증된 사용자 객체를 전달합니다. 인증에 성공한 경우, 사용자 정보 객체를 전달합니다. 인증에 실패한 경우, false를 전달합니다.
- info: 추가적인 정보를 전달할 수 있는 객체입니다. 주로 인증 실패 시 실패 원인에 대한 정보를 전달합니다.
그 외
- 위의 과정이 성공적으로 실행되면 session 설정에 따라 세션데이터를 쿠키에 담아 보낼 수 있습니다.
- 이를 위해서는 다음과 같은 코드를 작성합니다.
passport.serializeUser(function (user, done) {
done(null, user.id)
});
- serializeUser는 유저의 id 데이터를 바탕으로 세션데이터를 만들고, 쿠키로 담아서 사용자의 브라우저로 보내줍니다.
- 또한 로그인한 사용자에게만 보이는 사용자 개인 페이지를 만들기 위해서는 deserializeUser를 사용합니다.
app.get('/mypage', isLogin, function (요청, 응답) {
})
function isLogin(요청, 응답, next) {
if (요청.user) {
next()
}
else {
응답.send('로그인 하지 않으셨습니다.')
}
}
passport.deserializeUser(function (아이디, done) {
db.collection('login').findOne({ id: 아이디 }, function (에러, 결과) {
done(null, 결과)
})
});
- /mypage에 접근시 isLogin을 미들웨어로 로그인 여부를 확인합니다.
- 요청.user로 로그인 여부를 판단하는데, 이 때 사용되는 것이 deserializeUser입니다.
- 그러면 db에서 아이디와 일치한 게시물을 찾아서 요청.user에 저장합니다.
'개발 > node, express' 카테고리의 다른 글
서버에서 데이터 불러오기 (0) | 2023.05.30 |
---|---|
서버에서 데이터를 삭제하는 법 (0) | 2023.05.09 |
데이터에 id부여하기 (0) | 2023.05.07 |
데이터베이스에 데이터 저장하기 (0) | 2023.05.07 |
MongoDB (0) | 2023.05.06 |
댓글