프로젝트를 수행하면서 로그인 인증 기능 구현을 위해 현업에서도 많이 쓰인다는 passport 모듈을 사용해보았다.
각종 레퍼런스와 강의를 참고해 만들긴 했는데 정작 구현을 하고도 모듈의 쓰임을 정확하게 모르는 기분이 들어서 조금 더 공부한 내용을 정리하려고 한다.
express 는 설치했다는 가정하에 passport , jwt를 사용하기 위한 모듈 설치
$npm i passport passport-local passport-jwt jwt
passport는 여권이라는 이름과 같이 서버에서 사용자를 인증하기 위해 사용하는 Node.js용 미들웨어이다. passport는 다양한 인증 기능들(session, jwt 등)을 각 모듈로 패키지화 해 제공하고 있으며 편리하게 인증을 구현할 수 있다. 웹페이지를 이용할 때 로그인, 소셜 로그인을 통해 세션이나 쿠키에 토큰을 발급받고, 인증 가능하다.
구글, 페이스북, 카카오 같은 기존의 SNS 서비스 계정을 이용하여 로그인하는 기능도 해당 모듈로 구현이 가능하다.
passport.serializeUser과 passport.deserializeUser가 passport의 핵심이다.
serializeUser는 로그인 시 실행되며, req.session 객체에 어떤 데이터를 저장할지 정하는 메서드이다.
serializeUser가 로그인 시에만 실행된다면 deserializeUser는 매 요청 시 실행된다. passport.session 미들웨어가 이 메서드를 호출하는데, serializeUser의 done의 두 번째 인수로 넣었던 데이터가 곧 deserializeUser의 매개변수가 된다.
조금 전 serializeUser에서 세션에 저장했던 아이디 등을 받아 데이터베이스에서 사용자 정보를 조회한다. 조회한 정보를 req.user에 저장하므로 앞으로 req.user를 통해 로그인한 사용자의 정보를 가져올 수 있다.
즉, serializeUser는 사용자 정보 객체를 세션에 아이디로 저장하고, deserializeUser는 세션에 저장한 아이디를 통해 사용자 정보 객체를 불러온다. 이는 세션에 불필요한 데이터를 담는 것을 방지하게 해준다.