Session-based Authentication
세션
정보의 교환. 통신이 가능한 상태.
예) 로그인 기능
세션을 이용한 인증과정
- 클라이언트가 id 와 pw 를 서버에 보내어 로그인 요청을 한다.
- 서버는 비밀번호를 해쉬한 값과 DB 에 저장된 hash 값을 비교하여 맞는지 확인한다.(이때 hash 값은 salt 가 쳐진 hash 값)
- 맞으면
session id
를 session store
에 저장한다. (서버 자체 저장소나 redis 등과 같은 트랜젝션이 빠른 db)
Session id
를 클라이언트에 쿠키로 전달한다(connect.sid
).
- 로그인 성공
session id
가 포함된 쿠키가 삭제되지 않는다면 로그인 상태에서 가능한 작업들을 할 수 있다.
- 예를 들어 내 유저 정보 보기, 장바구니에 물건 담기 등.
- 위와 같은 작업을 클라에서 요청시
session id
를 쿠키로 보내면, 서버는 자신이 가지고 있는 session id
와 일치하는지 확인하여 클라이언트의 로그인 여부를 확인한다.
로그아웃 기능
- 서버에 저장된 session 정보를 삭제
- 클라이언트의 쿠키를 갱신 (서버가 클라의 쿠키를 삭제하진 못하기 때문에 쿠키의 값을 초기화함)
express-session
세션을 관리해주는 express module
req.session
에 원하는 값을 저장하면 알아서 session store
와 cookie 에 값을 저장해줌.
- 클라가 cookie 를 보내면 알아서 cookie 의
session id
와 session store
에 있는 id 를 비교하여 req.session
데이터를 가져옴.
- cookie 의 이름은
connect.sid
라고 부여함.
Session 인증이 들어간 axois 통신 사용하기
https://lahuman.github.io/cors_axios_session/
Session 의 한계
- 큰 회사의 사이트는 여러개의 서버를 사용한다. 예를 들어 로그인 요청을 했을 때 가장 여유로운 서버에 요청이 된다.
- session 을 통해 로그인 인증을 할 경우 서버에 session id 를 저장해야 하는데, 서버가 여러개이므로 모든 서버에 session id를 저장하도록 만들어야한다. 이 과정이 비효율적일 수 있다.
- session 정보만 따로 저장하는 서버를 따로 만들어줄 수는 있다.
따라서 요즘은 대부분 여러대의 서버를 사용하기 때문에 클라이언트만으로 해결이 가능한 token 방식을 사용한다.