Passport js 로그인 원리

강보석·2021년 8월 7일
0

이번 포스팅은 제가 로그인을 구현할 때 쓰는 Passport js라는 라이브러리에 대해 설명하려고 합니다. 정확히는 원리에 대해서만 설명하려고 합니다.

먼저 로그인에 대해 이해하시려면 쿠키세션에 대해 아셔야합니다. 쿠키세션의 목적은 똑같이 어떤 정보를 저장하는 용도이지만 쿠키는 클라이언트에서 가지고 있는 것이고 세션은 서버에서 가지고 있는 저장소입니다. 그렇기 때문에 클라이언트 쪽에서 가지고 있는 쿠키는 서버가 가지고 있는 세션에 비해 보안이 취약합니다. 그래서 비밀번호와 같은 민감한 정보는 넣으시면 안됩니다.

서버에서 쿠키를 만들 때에는 res.cookie(쿠키이름, 들어갈데이터를담은객체, 추가옵션) 이렇게 해주시면 되고 읽을 때에는 req.cookie로 접근해주시면 됩니다. 쿠키에 들어갈 데이터를 암호화시키시는 것을 추천합니다. cookie-parser라는 미들웨어를 넣으실 때 시크릿 키를 넣어주시고 쿠키를 만들 때 추가옵션 부분에 signed: true로 해주시면 됩니다.

이제는 Passport js 기준으로 로그인 과정에 대해 설명을 드리겠습니다.

일단 로컬 로그인 기준으로 passport에는 serializeUserdeserializeUser가 있습니다. serializeUser는 유저의 데이터를 가지고 있을 때 유저의 고유번호인 id를 세션에 넣어주는 역할을 합니다. deserializeUser는 반대로 유저의 고유번호인 id를 가지고 있을 때 id를 토대로 유저의 데이터를 가져온 다음 req.user에 데이터를 넣어주는 역할을 합니다.

Passport는 위에 두 과정을 이용하여 로그인 과정을 이루어집니다.

유저가 로그인을 할 때 유저가 입력한 유저 데이터를 기반으로 serializeUser 과정을 실행합니다. 세션에 passport라는 객체가 만들어지고 그 안에 유저의 고유번호인 id가 들어갑니다. 그 다음 세션에 cookie라는 객체가 만들어진 다음 세션아이디 등의 데이터를 암호화한 쿠키를 클라이언트에게 보냅니다. 쿠키를 보내고 마찬가지로 유저의 데이터를 클라이언트에 보낸 다음 클라이언트에서 그 데이터를 기반으로 로그인을 시킵니다.

클라이언트에서는 로그인이 필요한 활동을 할 때마다 쿠키를 서버에 보내서 서버에서 그 쿠키에 들어있는 데이터를 기반으로 세션을 찾은 다음 passport 객체 안의 id를 이용하여 deserializeUser 과정을 실행합니다. id로 유저의 데이터를 데이터베이스에서 가져온 다음 req.user에 넣어줍니다. 서버에서는 req.user에 데이터가 들어있는지 없는지를 확인해서 로그인을 했는지 안했는지 알 수 있습니다.

이제 마지막으로 로그아웃할 때는 해당 세션을 파괴함으로써 세션에 담겨있던 cookie와 passport 객체를 찾을 수 없게 해 쿠키를 가지고 있어도 찾을 수 없게됩니다.

profile
안녕하세요. 컴퓨터를 공부하는 학생입니다.

0개의 댓글