passport : http://www.passportjs.org/
Simple, unobtrusive authentication for Node.js
패스포트는 인증을 위한 다양한 Strategy Package를 제공합니다. 아래 본문은 그 중 Local Strategy에 대해 설명합니다.
local strategy
외부 시스템의 인증 연동없이 직접 구현하는 방식이며 사용자 상태 관리를 위해 세션을 사용합니다.
로그인, 리소스 호출에 대한 흐름을 정리하고 코드로 설명하겠습니다.
사전작업
패스포트가 자동으로 생성해주는 함수 (변수)
- req.user : 로그인한 사용자 정보
- req.login(=logIn) : 로그인 함수 (세션에 사용자 정보를 저장)
- req.logout : 로그아웃 함수 (세션정보 비움)
- req.isAuthenticated : 요청 사용자의 인증여부 확인
Session Storage 설정
- express 는 기본 session을 in-memory 방식으로 저장하기 때문에 memory leak 문제가 있음(production 환경에서 사용 X)
- memory leak 방지 등 몇 가지 목적으로 session-storage 사용 추천 (mysql, mongodb, redis 등 모두 사용 가능함)
- session 은 기본적으로 passport가 아닌 express에서 관리해주고 있음, passport에서 회원정보를 기본적으로 저장하는 req.user정보는 req.session.passport.user를 의미하고 response하는 시점에 세션정보를 갱신함(store를 따로 써도 자동으로 갱신해줌)
- response하는 시점에 session을 업데이트하기 때문에 문제가 발생하면 req.logIn을 이용해서 serialize를 명시적으로 해줄 수 있음
1 | const express = require('express') ; |
passport 기본 함수 구현
passport id & pwd 체크
1 | const passport = require('passport') |
user serialize
1 | passport.serializeUser(function(user, done) { |
user deserialize
1 | passport.deserializeUser(function(user, done) { |
authentication middleware
1 | function authenticationMiddleware () { |
login flow
flow
- id 와 password를 post method로 login url로 요청
- login router에서 passport.authenticate 함수를 이용해 strategy를 선택
- 선택된 strategy에서 id, password 비교 (db 조회), 비교 결과를 callback 함수를 이용해서 passport.authenticate 두번째 인자 함수로 전달
- serialize 를 통해 session에 user 정보 저장
- callback 함수안에서 req.logIn 함수 실행
- Set-Cookie 헤더에 세션키값을 저장하여 response
- session storage를 사용하는 경우 response할 때 req.session 에 있는 user 정보를 storage에 저장
code
1 | app.get('/login', function(req, res, next) { |
resource authentication flow
flow
- endpont로 request 보냄
- cookie이용해서 session 정보 조회
- session 정보 deserialize 해서 user 정보 얻기
- req.isAuthenticate 함수를 이용해서 인증된 요청인지 확인
- 인증된 경우 / 인증되지 않은 경우에 따라 처리
code
1 | const passport = require('passport') |