티스토리 뷰

728x90

 안녕하세요! 세션을 이용해서 인증하는 Passport에 대해서 알아보겠습니다. 이번 포스팅은 생활코딩님의 passport.js를 바탕으로 작성했습니다. 


1. passport 인증 구현

    passport란 사용자 인증 절차에 대한 로직을 간단하게 구현할 수 있도록 도와주는 Node.js 미들웨어입니다. 간단한 부분부터 차근차근 알아보겠습니다. 

    첫 단계에서 알아볼 과정은 main.js에서 어떻게 passport를 사용하는가에 관련된 내용입니다. main.js에서는 passport와 passport전략을 불러오고 각 요청에 알맞게 할당하면 됩니다.

 

//main.js
var passport = require('passport'),
	LocalStrategy=require('passport-local').Strategy;
    
app.post('/auth/login_process',
	passport.authenticate('local',{
    	sucessRedirect: '/',
        failureRedirect: '/auth/login'
}));

<코드 설명>

1. require로 passport 미들웨어를 불러옵니다.

2. 이번 예제에서는 소셜 로그인이 아니라 로컬 전략을 사용합니다.  따라서 LocalStrategy도 함께 불러옵니다.

*passport에는 local 뿐만 아니라 kakao, google, facebook, twitter와 같은 전략도 존재합니다. 

 

3. 로그인 라우터에 연결합니다. 본 예제에서는 /auth/login_process에 해당합니다.

4. POST 요청에 대한 콜백함수로 passport.authenticate를 사용합니다. 로컬 전략을 사용하기 때문에 첫 번째 매개변수는 local입니다. 두 번째 매개변수는 redirct를 설정합니다. 성공할 경우(sucessRedirect)에 메인화면('/')으로 redirect하고 실패할 경우(failureRedirect)에는 로그인 화면('/auth/login')으로 redirect 합니다.

 

*로그인 이후 redirect 뿐만 아니라 함수를 작동시키고 싶다면 다음 코드처럼 하면 됩니다.

-> passport.authenticate('local'),

         function(req, res){

             // 이 함수는 로그인이 성공됐을 경우에만 실행됩니다.

             // req.user는 로그인에서 인증된 유저를 의미합니다.

             res.redirect('/');

     });


2. passport 자격 확인

 앞 단계에서 passport를 main.js에서 어떻게 불러와야할 지를 알 수 있었습니다. 이제는 passport가 어떻게 사용자를 인증하는지, 자격 확인에 대해서 알아보겠습니다.

 passport는 요청을 처리하기 전에 passport.use 코드로 인증할 전략을 세웁니다. 밑에 있는 코드는 전략을 세우는 코드라고 생각하시면 편합니다.

//main.js
// ... LocalStrategy = require('passport-local').Strategy;

    
passport.use(new LocalStrategy({
	usernameField: 'email',
	passwordField: 'pwd'
}, function (username, password, done) {
	User.findOne({ username: username }, function(err,user) {
    	if (err) { return done(err) };
        if (!user) {
        	return done(null,false, { message: 'Incorrect username.' });
        }
        if (!user.validPassword(password)){
        	return done(null,false,{ message: 'Incorrect password.' });
        }
        return done(null,user);
    });
}));

//app.post('/auth/login_process', ...

 

<코드 설명>

1. passport는 사용자 이름과 비밀번호를 사용할 때 username, password을 기본으로 사용합니다. 우리가 원하는대로 바꿔서 사용하고 싶을 경우, usernameField : 'email' 과 passwordField: 'pwd'와 같이 설정하면 사용자명은 email으로 사용하고, 비밀번호는 pwd로 사용할 수 있습니다. 

2. User.findOne은 몽고디비 코드입니다. 사용자가 있는지 없는지 찾는 코드입니다. 

3. 만약 에러가 발생할 경우 done(err)을 호출해서 첫번째 인자로 err를 넘겨주면 passport가 알아서 에러를 처리해줍니다.

4. 만약 사용자가 없을 경우, done(null, false, {message: 'Incorrect username'})을 호출합니다. 3번과 같이 보셨다면 눈치채셨겠지만 done은 첫 번째 인자로 에러, 두 번째 인자로 성공했을 경우 데이터 or 실패했을 경우에는 false , 세 번째 인자는 추가로 넣고 싶은 정보를 넣습니다.

*done을 어떻게 호출하느냐에 따라서 로그인의 성공, 실패를 알려줄 수 있다.


3. passport.initialize() 사용

 passport를 사용할 때, main.js에서 app.use(passport.initialize()); 와 app.use(passport.session()); 를 통해서 express가 passport 미들웨어를 사용할 수 있도록 해야합니다. 

//main.js
// ... LocalStrategy = require('passport-local').Strategy;

app.use(passport.initialize());
app.use(passport.session());

//passport.use(new LocalStrategy( ...

4. serialize 사용

 passport는 내부적으로 session을 이용합니다. session을 이용하기 위해서 passport는 serialized와 deserialize를 통해서 세션을 설정해야합니다.

// ... app.use(passport.session());

passport.serializeUser(function (user, done) {
        done(null, user.email);
});

passport.deserializeUser(function (id, done) {
        done(null, authData);
});
    
// passport.use(new LocalStrategy( ...

<코드 설명>

  • serializeUser
    • 로그인에 성공한 경우 실행
    • 사용자의 식별자를 session store에 저장한다.
    • passport는 로그인에 성공하면 사용자 정보를 serializeUser의 첫 번째 인자(user)로 주입한다.
      • 이때, 사용자 정보는 new LocalStrategy의 콜백함수에서 보낸 done()의 두 번째 인자를 뜻한다.
    • serializeUser는 done(null, 각각의 사용자를 식별할 수 있는 id); 으로 응답한다.
      • 위의 코드에서 사용자 식별 id는 user.email 이다.
  • deserializeUser 
    • 로그인 후 페이지에 방문할 때마다 실행
    • 저장된 데이터를 기준으로 우리가 필요한 정보를 조회할 때 사용한다.
    • done(null, 사용자 데이터)로 응답한다. 
      • done의 두 번째 매개변수의 값은 sucesssRedirect된 요청의 req.user에 값이 들어간다.
      • 예를 들어서, successRedirect('/')일 경우, app.post('/',(req,res)=>{  } 에서 req.user는 done의 두 번째 매개변수의 값이다. 
      • req.user에 값이 있는지 없는지를 통해서 로그인 확인을 한다.

 

로그인 완료!


5. 로그아웃

 로그인을 완료했으니 이제 로그아웃을 처리해야합니다. 

 passport에서 지원하는 로그아웃은 request.logout() 입니다. 로그아웃은 모든 라우터에서 사용이 가능합니다. 요청은 우발적이거나 악의적인 로그아웃을 방지하기 위해 POST와 DELETE를 권장하고 있습니다. 로그아웃 세션은 req.user 프로퍼티와 로그인 세션을 삭제합니다. 

//main.js

app.post('/logout', function (request, response) {
  request.logout();
  request.session.save(function () {
  	response.redirect('/');
  });
});

<코드 설명>

1. request.logout() 으로 logout 한다.

2. request.session.save( ... ) = 즉시 session 데이터 저장을 하고, save가 모두 끝나면 콜백 함수가 실행된다.

*세션 스토어가 바쁠때 request.logout()을 진행하면 결과가 바로 반영되지 않을 수 있다. 로그아웃이 바로 반영될 수 있도록 request.session.save()를 이용한다.


 

 이상으로 passport-local 로그인 & 로그아웃에 대해서 알아보았습니다. 감사합니다!

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함