네이버는 어떻게 로그인 이후 탭 간에 로그인 상태를 연결할 수 있을까 하는 생각이 들었다. 게다가 브라우저가 종료되지 않더라도 naver 페이지(들)만 꺼지면 자동으로 로그아웃이 되는 것이었다.
일단 떠오르는 건 cookie, local storage, session storage
를 사용하면 될 것 같다. 그런데 session storage 는 페이지 세션에 한정되므로 탭 간에 상태를 공유하는 것은 불가능하므로 배제되었다.
그럼 cookie 나 local storage 를 사용할 수 있을 것 같다.
local storage는 영구적으로 유지되므로, 수명을 정할 수 있는 cookie에 비해 보안성에서 보다 취약할 것이라고 예상되서 탈락이다.
따라서 cookie를 사용해야 할 것 같다. 하지만 세션 쿠키는 브라우저가 종료되어야만 사라지는데 어떻게 탭이 사라진 것만으로 구현하지...
알고보니 (1)의 전제가 잘못되었다. "게다가 브라우저가 종료되지 않더라도 naver 페이지(들)만 꺼지면 자동으로 로그아웃이 되는 것이었다." 는 내가 왜인지 몰라도 잘못 알고 있었던 것이었다. 네이버도 동일하게 브라우저가 종료시에 session cookie가 만료되면서 로그아웃된다.
세션 쿠키를 연구하는 과정에서 궁금증이 생겼다. 클라이언트 쪽에서는 (단순히 세션 id를 담은 쿠키가 아니라)세션 쿠키가 브라우저의 종료와 함께 삭제되지만 서버측에서는 어떻게 세션 데이터를 삭제할 수 있을까?
일단은 max-age
를 설정하여서 서버측에서도 세션이 일정 시간이 지나면 만료된 세션 데이터임을 알 수 있도록 해보았다. 그리고 session-file-store
에 rolling
옵션을 적용해서 서버와 통신이 있을 시에 max-age 를 갱신하는 식으로 설정해 두었다. 그런데 max-age 를 설정하면 클라이언트 측에서 세션 쿠키로 인식하지 못했다. max-age 를 가지면 영구적 쿠키가 되어서 브라우저에서 쿠키를 삭제하지 않았다.
아무래도 session-file-storage
를 사용하는 한계인 것 같다. 실제로는 Redis
와 같은 database 를 따로 설정한다고 하는데 아무래도 database 측에서 따로 설정을 통해서 세션을 독립적으로 삭제하는 것 같다. oracle의 문서를 보는데 아무래도 db의 자체적인 로직으로 삭제 작업을 수행하는 것처럼 보인다.
HTTP 쿠키 - 세션쿠키(Session Cookie), 지속쿠키(Persistent Cookie) : 네이버 블로그
node.js - ExpressJS session expiring despite activity - Stack Overflow
c# - how to kill the session when user closed the browser without logout - Stack Overflow
서버에서의 세션 정보 삭제
1) 사용자가 로그아웃을 하면 세션 정보는 내부 로직에 의해 보통 자동으로 삭제된다.
2) 서버에서 세션의 종료 시점을 지정한다. 예를 들어 세션의 종료 시점을 세션 생성 시점으로부터 30분으로 잡으면 30분마다 계속 로그인해야 하는 번거로움이 발생하므로, 사용자가 서버에 마지막으로 요청한 시간을 기준으로부터 30분 후에 세션을 종료하는 방법이다.
출처: 쿠키(cookie), 세션(session)