본문 바로가기

개발

[node.js] passport 모듈 사용법

passport의 공식 홈페이지로부터 참고하여 정리해 올립니다. www.passportjs.org/docs/

이 글은 local-login 전략에 대해서만 설명합니다.

기본 동작

 login경로로 post 요청이 들어오면, passport.authenticate() 미들웨어로 인증 절차를 거친다. 인증이 성공한다면, 다음의 handler 실행되고, req.user 프로퍼티가 인증된 유저에 세팅된다

passport.authenticate()안에는 사용할 인증 전략(strategy) 넣어준다. 인증 전략은 라우터에서 미들웨어를 사용하기 전에 만들어져 있어야 한다. (이 경우는 local로그인 전략을 사용한 것이다.)

 

passport 사용을 위한 환경 설정하기

authentication 위해 passport 사용하기 위해서는, 다음의 가지가 설정되어 있어야 한다.

1. authentication strategies(인증 전략)

2. 어플리케이션 미들웨어

3. 세션 (선택)

 

1. 인증 전략

패스포트는 요청을 인증하기 위해 '전략'이라고 하는 것을 사용한다. 전략에는 username password 확인하는것(local Strategy), OAuth 사용해서 인증을 위임하거나 OpenID 사용해서 연합인증하는 방법 있다.

Passport 로그인을 요청하기 전에, 어플에서 사용할 전략이 우선 정해져야 한다. 전략을 정하는 것은 use( )함수를 사용해서 있다. 아래의 코드는 local 로그인 전략을 사용한 것이다. 

 

위의 코드에서, '전략' '확인콜백'(verify callback) 필요로하는것을 있다. Passport 요청을 인증할 , 우선 요청에 포함된 username과 password 분석하고, 확인 콜백에 인자로 넣어준다. username password 올바르다면, 확인콜백은 done 호출해서 인증 사용자를 Passport 제공한다.

 

만약 받아온 username또는 password 틀렸다면 done user 대신 false값으로 호출되어야 한다. 인증 실패의 이유를 나타내기 위해 메시지를 추가할 수도 있다. 이것은 유저가 다시 실행해보도록 flash message 띄울때 있다.

 

 

마지막으로, username password 확인하는 과정에서 예외가 발생했다면(데이터베이스 문제 ), done err으로 호출되어야 한다. 

주의) 아이디 혹은 비밀번호에 오류가 있을 때는 err위치에  null 오고, 서버상의 문제가 있을 때는 done(err) 호출해야 한다.

 

2. 미들웨어

Passport 초기화하기 위해서는, passport.initialize( )미들웨어가 필요하다. 만약 어플리케이션에서 persistent login session 사용하려면, passport.session( )미들웨어 또한 사용되어야 한다. 세션을 사용하는건 옵션이지만, 사용하는것을 추천한다. session( ) passport.session( )전에 와야한다.

 

 

3. 세션

 - 어플리케이션에서, username password 로그인 요청시에만 전달된다. 인증이 성공한다면, 세션이 설정되고 유저의 브라우저의 쿠키를 통해 관리된다. 

 - 후의 요청은 username password 포함하지는 않지만 대신 세션을 특정해주는 쿠키를 포함한다. 로그인 세션을 이용하기 위해 Passport 세션에서 또는 세션으로 유저 인스턴스를 serialize, deserialize해야한다.

 

  예제에서 user.id 세션으로 serialize되었다(세션에 저장된 데이터 양을 줄이기 위해서). 후에 요청을 받는다면, ID 사용자를 찾는 사용되고 req.user 복원될 것이다.

 

** 세션 사용하지 않기

API서버가 username, password 요청마다 요구한다면, 세션은 필요 없다. 이런 경우라면, session옵션을 false 두면 안전하게 세션기능을 있다.

 

local-strategy에서 받아올 form의 name값을 직접 설정하기

유저를 인증하기위해 사용되는 가장 보편적인 방법은 username password 통한 것이고, 'passport-local'이라는 모듈을 통해 지원된다.

function username, password 들어가있는데, 이건 passport모듈이 기본적으로 받아온 form에서 name 값이 username, password 것을 찾아서 가져오도록 되어있기 때문이다. name값이 다르게 설정되어있는것을 받아오려면, 

 

이런식으로 usernameField passwordField값을 직접 설정해준다.