목표
쿠키에는 세션id가 들어있고, 세션id를 만료시켜서 쿠키가 실제로 유효하지 않도록 할 것이다.
의도
지난 포스팅에서도 문제를 제기했듯, 세션Id를 쿠키에 담아서 전송하게 되면,
그대로 세션Id가 노출이 되기 때문에 세션id를 db에서 관리하는게 의미가 없지 않나 싶다.
세션로그인의 장점은 인증정보를 클라이언트가 아닌 서버에서 관리한다는 것인데,
쿠키로 주고받는다는건 클라이언트 또한 세션id를 알고 있기 때문에
언제든지 세션하이재킹에 노출될 위험이 있기 때문이다.
다만, 클라이언트의 직접적인 접근을 막기 위해 httpOnly와 https로의 접근만 허용하도록
secure을 설정할 수는 있겠지만, 그 이외에 내가 로직으로 구현해서 신경쓸 수 있는 부분이
어떤 부분일지 고민해보았다.
express-session에서 만료기간을 설정하게 되면, 세션의 쿠키에 관한 만료기간을 설정하는 것이라,
쿠키 자체가 사라져 버린다. 하지만 별도로 res.session.destroy()를 하게 되면,
db에 있는 세션만 destroy해서 날려버린다.
그렇게 되면 쿠키는 남아있지만 그 안의 세션Id가 db에서는 사라져 있으므로 유효하지 않은 쿠키가 된다.
이렇게 하면 세션이 만료되었을 때 자동으로 로그아웃되는건 같지만 쿠키는 남아있다.
그리고 다시 로그인하면 새로운 세션id와 함께 쿠키도 바뀐다.
해결 과정
기존에는 로그아웃하지 않으면 그대로 쿠키가 남아 있었다.
db에 저장된 세션id가 쿠키에 있는 세션id와 같을 경우 올바른 인증정보로 보았다.
그리고 전역으로 세션을 확인하는 미들웨어를 설정하여 세션을 유지하거나 로그아웃되도록 했는데,
1. 세션이 발급되는 시점의 시간에서 별도로 설정한 시간을 더해 만료기간을 설정했다.
( 세션 발급시간은 세션을 저장할 때 session.data로 createdAt을 설정하였다. )
2. 현재 시간이 설정한 만료시간을 지나게 되면 세션을 만료시켰다.
만료시간을 지날 경우 res.session.destroy()를 했고,
다만 아직 로그인을 하지 않아서 세션 자체가 없을 경우에는 next로 넘겼다.
로그인하게 되면 세션이 유지되는 시간 동안은 계속해서 인증이 되어있지만,
만료시간이 되면 쿠키는 남아있지만 db에서 값이 없어진다.
코멘트
쿠키를 지우는 것이나 db를 날리는 것이나 결과 자체는 같을 수 있지만,
중간에 세션id를 가로채는 세션하이재킹에 있어서 헛수고를 할 수 있도록 과정을 만들었고,
나중에는 세션id의 유효기간을 아주 짧게 설정하고, 클라이언트에서 인증을 요청하면
새로운 세션id를 발급하는 방식으로 진행하면 어떨까 싶다.
'개발 > 프로젝트' 카테고리의 다른 글
[세션 / 토큰 로그인 프로젝트] 고도화(2) 멱등성 검사 미들웨어(1) 계기 및 기획 (0) | 2023.07.20 |
---|---|
[테스트코드(TDD)] (1) 구현하기 전 공부, 고민한 부분들 (0) | 2023.07.18 |
[가격 비교 프로젝트] 기획 (0) | 2023.07.16 |
[세션 / 토큰 로그인 프로젝트] 고도화(1) 네이버의 로그인 관련 세션쿠키 파헤치기 (0) | 2023.07.15 |
[세션 / 토큰 로그인 프로젝트] 진행 상황 및 토큰 로그인 구현 (0) | 2023.07.14 |