티스토리 뷰

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
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 31
글 보관함