주요 내용으로 건너뛰기

Passport.js, 왜 저는 deserialize user 가 실행이 안 되나요?

passport documents가 말해주지 않는 것들

Passport.js 는 Hello.js 같은 새로운 인증 라이브러리가 등장하는 와중에도 굳건하다. 

local strategy 만 해도 npm 다운로드 수 60만에 육박하는 인기를 누리고 있으며,

node.js 인증 관련해서 물어보면 Passport.js 를 쓰는 방법을 알려주는 블로그 포스트를 보여주기도 한다.

naver, kakao 등 한국 기업 관련한 전략(Strategy)가 있는 것 또한 굉장한 이점이다.

한국에서는 Egoing 님이 생활코딩 사이트를 통해 정말 처음부터 끝까지 인증과정 등을 설명한 바 있다.

생활코딩 - node.js 배우기(https://opentutorials.org/course/2136)

Passport.js 는 분명 사용하기 쉬운 라이브러리라는 점을 강조하는 것 같다.

공식 문서들만 읽어봐도 "어때? 이정도 세팅만 하면 바로 사용할 수 있어!" 라고 말하는 것 같은 착각도 든다.

그러나 Passport.js 를 배우다보면 생각지도 못한 곳에서 안 되는 것들이 생겨나곤 한다.

그 중 하나가 deserializeUser 함수다. 


* local login 기준입니다.

Passport.js 는 Strategy를 이용해서 user를 디비에 저장하고 --> serialize user를 통해 세션을 생성하고 --> deserialize user를 통해 req.user 객체에 유저 정보를 저장한다.

그렇기 때문에 인증작업이 완료되면 우리는 그저 req.user 객체에 담긴 정보를 바탕으로 이 유저가 인증된 유저인지 혹은 아직 인증되지 않은 유저인지 구분하는 isAuthenticated 같은 미들웨어를 작성할 수 있는 것이다.

그러나 간혹 serialize user 까지는 잘 실행이 되는데 deserialize user 가 실행이 되지 않는 경우가 있다.

이 경우 세션은 차곡차곡 생성되지만 같은 유저가 다시 로그인을 시도해도 다른 세션이 저장된다 ?!


Stackoverflow를 몇 시간 동안 해맨 결과 deserialize user 가 실행이 되지 않는 경우는 크게 두 가지로 나뉜다는 것을 알았다.

1. CORS(cross-origin-resource-sharing) 문제인 경우

2. Cookie 의 secure 설정이 true 인 경우

내 경우는 2번째 경우였고, 세션 스토어의 쿠키 객체의 secure 값을 false 로 줌으로써 금방 해결할 수 있었다.


혹시 원본 답변이 궁금하다면 답변주소(https://stackoverflow.com/questions/26109556/req-session-passport-is-empty-deserializeuser-not-called-expressjs-passport/30293275#)로 들어가보길 바란다.


이준형 님의 창작활동을 응원하고 싶으세요?

댓글