Day 24 개발일지 Web - boostcamp-2020/Project03-A-TOTP GitHub Wiki
개발일지
로그아웃
우선 로그아웃을 위해서 어떤 작업이 필요할지 정리해봤다.
세션삭제, CSRF Token Cookie삭제, local Storage User 삭제, Page Reload 이렇게 4가지의 작업이 필요했다.
우선 세션삭제와 CSRF Token Cookie 삭제를 서버에서 먼저 진행해주기 위해 컨트롤러를 생성하였다.
하지만 그 때 생성한 코드는
async logout(req, res, next) {
req.session.destroy((err) => {
if (err) next(createError(err));
// eslint-disable-next-line no-unused-expressions
req.session;
res.clearCookie('csrfToken');
res.clearCookie('connect.sid');
});
res.json({ result: true });
},
이거였지만.. [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
에러를 볼 수 있었다. 왜 이런 에러가 나오는거지.. 하고 찾아보던 중 알게된 사실은 req.session.destroy() 함수가 비동기 이기 때문에 res.json을 보내고나서 destroy함수 안에서 req, res값을 변경하려고 했기 때문이다. 때문에 res.json또한 destroy 함수안에 넣어주는 것으로 해결 !!! 한 것 같았으나..... 이렇게 세션을 삭제하면 Redis 이벤트를 처리하여 세션이 만료되었을 때 로그 테이블의 세션값이 삭제 됐던 것 처럼 로그 테이블에 세션값이 삭제 되는줄 알았으나 만료되었을 때만 적용 되어있다고 들었다.. 그래서 함께 고민을 하던 중 만료시키는 것과 같이 이벤트를 pub/sub 패턴으로 처리해주는 것이 방향성이 맞다고 판단하여 Destroy 도 이벤트를 수신하여 처리하도록 하였다 ㅎㅎㅎ
Session 갱신
session 을 갱신해주기 위해 초기에는 req.session.touch()
로 해결이 되는 줄 알았으나 전혀 아니였고 새로 만드는 것처럼 만들어서 보내주어야 갱신이 되는 것을 확인할 수 있었으며 session은 express session에 있는 resave 와 rolling 을 켜두면 자동으로 해결 되는 부분이이였다.
Session Destroy 처리
그냥 간단하게 sid 를 가지고 있다가 session db 인 redis에서 제거하였다. 간단한 방법이라 편했지만 이 방법이 정확한지는 모르겠다.
개인회고
진구
개발을 하면서 나와있는데로 그대로만 해보는 것보다 자세한 내용을 찾아보고 이것저것 해보면서 정리하는 것도 나쁘지 않다는 생각이 들었다. 앞으로 헷갈리는 부분은 이것저것 해보면서 정리해놔야겠다 !!
도경
저녁에 iOS api의 user부분을 구현했는데 대부분 이전에 해봤던 작업들이라 수월하게 구현할 수 있엇고, 빠르게 완료할 수 있었다.
석암
session 관리가 은근하게 어렵다는게 느꼈다 옵션 등 평소 개발에서 써본 옵션이 아니라서 체감상 그랬던것 같다