티스토리 뷰

Node.js에서 인증을 위한 미들웨어인 passport.js를 사용하는 방법부터 주의할 점을 요약해 보았다.


사용 방법은 passport.js 공식 사이트의 Documentation의 글을 요약한 것이다.


다시 passport.js (이하 패스포트)가 왜 나왔는지 짧게 얘기하면,

모던 앱에서는 인증 방식이 굉장히 다양하다. 소셜 네트워킹이 증가하면서 페이스북이나 트위터로 인증하는 것이 인기있는 방법이 되었다. 이런 SNS나 OAuth를 제공해주는 API를 제공하는 서비스들은 이제 접근을 제어하는 방식으로 토큰 기반의 증명서를 요구하곤 한다. 

패스포트는 앱이 구글로 가입할거냐, 페북으로 가입할거냐, 로컬에서 직접 가입할거냐 등 인증 요구사항을 가지는 것을 인지하고 전략 (strategies)으로 알려져 있는 인증 메커니즘을  모듈로 패키지화 해서 제공하고 있다. 즉, 앱은 패스포트에서 지원하는 전략을 선택해 의존성 없이 독립적으로 이용가능하다.

그래서 인증이라는 기능의 복잡성에도 불구하고 코드는 복잡해지지 않는다.


패스포트 기본 설정으로 이용하기

패스포트는 디폴트로 인증이 실패하면 401 상태로 응답하고 성공하면 다음 핸들러가 호출되어서 'req.user' 속성이 인증된 사용자로 설정된다.

redirect 옵션은 디폴트 행동을 오버라이드할 수 있다


인증 성공/실패 및 에러 상태를 확인하는 방법?

상태정보를 유저에게 보여주기 위해 flash 메세지를 설정할 수도 있는데 failureFlash true 설정해두면 패스포트가 전략의 확인 콜백에서 받은 메세지를 사용해 에러 메세지를 플래쉬한다.

아니면 그냥 failureFlash 문자열로 설정할수도 있다.

successFlash는 성공했을 때 상태 값이 전달된다.

flash req.flash 함수를 요구하는데 Express 2.X에서 기능을 제공하다가 3.x부터 제거해서 connect-flash 미들웨어를 사용해야 한다.



로그인 세션 유지하는 방법?은 디폴트로 제공되는데,
세션을 유지하고 싶지 않을때?

인증에 성공하면 패스포트는 영구적인 로그인 세션을 만들 것이다. 보통은 유용하지만 필요없는 경우도 있다. 예를 들면 API 서버는 주로 증명서가 요청마다 제공되기를 요구한다. 이런 경우 세션 지원은 session옵션을 false 두어서 안전하게 disable 있다.


커스텀으로 인증 성공/실패를 다루는 방법

빌트인 옵션이 인증 요청을 다루는데 적절하지 않으면 성공 또는 실패를 다루는 커스텀 콜백을 쓸수도 있는데 이경우 세션을 생성하고 응답을 보내는 책임은 앱에 있다. 위의 일반적인 인증 방법과 비교해보면 라우팅 주소 '/login'뒤  미들웨어로 passport.authenticate을 한 디폴트와 다르게 커스텀에서는 라우팅 후 콜백 함수 안에서 passport.authenticate 함수를 호출하는 것을 볼 수 있다. 콜백함수 안에서 호출함으로써 req, res, next 파라미터를 사용할 수 있게 된다.

//일반 

//커스텀


패스포트 사용전 알아두어야 할 환경설정 속성

설정되어야 부분은 크게 '인증 전략, 미들웨어, 세션 (옵션)'이다.


인증전략

전략과 환경설정은 use() 로 설정한다.

아래 LocalStrategy 사용법에서 passport.use()로 시작하는 것을 볼 수 있다


미들웨어

Connect Express기반 앱에서 패스포트 초기화

app.use(passport.initialize());

app.use(passport.session());

express.session() 반드시 passport.session()전에 사용해야 한다. (로그인 세션이 올바른 순서로 저장되게 하려면)



세션

세션에 저장된 데이터 양을 작게 유지하기 위해 사용자 id serialize한다. 요청이 오면 req.user 저장된 id 사용자를 찾는다.



인증 전략중 하나인 LocalStrategy 사용법

가장널리 사용되는 인증 방법은 username password이다.

이건 passport-local 모듈로 지원된다.

디폴트로 LocalStrategy 증명서를 username  password 명시된 파라미터에서 찾는다. 필드를 다르게 하고 싶으면 옵션으로 바꿀 있다.

요즘은 username이 아니라 email과 password 방식을 많이 사용하기도 하는데 아래 코드에서 usernameField를 email로 재정의 해보았다.

(passwordField는 원래 password로 사용되지 때문에 재정의한 후 변화는 없다)


로그인

패스포트는 req login() 함수를 줘서 로그인 세션을 생성하는데 사용한다.

로그인이 성공하면 user req.user 할당된다

passport.authenticate() 미들웨어는 req.login() 자동으로 호출한다. 함수는 처음 회원가입할때 사용된다. (새롭게 사용자 등록을 하기 위해)

로그아웃

req.logout() req.user 제거하고 로그인 세션을 지운다.



OAuth를 사용하는 방법은 이전 passport-facebook.js 관련 게시물에서 언급을 해서 생략한다.


참고자료

패스포트 공식 사이트, http://passportjs.org/

댓글