- 쿠키/세션 기반 인증과 JWT 기반 인증에서 로그아웃을 구현하는 방식(세션 삭제 vs 토큰 무효화)을 비교하고, 각각의 장단점을 설명한 뒤 “사용자가 로그아웃 버튼을 눌렀을 때, 서버 입장에서 무엇을 해야 진짜 로그아웃이라고 할 수 있는가”를 논리적으로 서술하시오.
[내가 주제를 보고 들은 생각]
- 세션삭제는 말그대로 세션을 삭제해서 로그아웃..
- 토큰 무효화는 토큰 만료일 지나게해서 로그아웃..
- 서버 입장에서는 세션이든 토큰이든 그사람을 인증할만게 없으면 로그아웃 아닐까?
<aside>
❓
서버입장에서 무엇이 진정한 로그아웃인가? 이를 위해 무엇을 해야하는가?
- 세션이든 토큰이든 더 이상 신뢰되지 않는 상태를 만드는 것이며, JWT는 이를 물리적 삭제 대신 무효화를 통해 ‘논리적 삭제’로 구현
- 이를 위해 세션이든 토큰이든 해당 인증 수단을 삭제 또는 무효화하는 조치를 취해야하며, JWT의 경우엔 서버가 상태를 직접 삭제할 수 없기 때문에 토큰을 무효화(논리적 삭제)하고 필요한 경우 stateful한 관리(블랙리스트, 리프레시 토큰 철회 등)를 병행해야함.
</aside>
세션과 토큰
-
사용하는 이유는?
-
가장 큰 차이는?
- 세션은 서버에 저장, 토큰은 클라이언트에 저장
삭제와 무효화
- 삭제 : 데이터 자체를 물리적으로 제거(물리적)
- ex) 세션 저장소(메모리/Redis/DB)에서 해당 세션 키를 완전히 제거
- 무효화 : 더 이상 유효하지 않도록 표시하거나, 재사용이 불가능하게 만드는 행위(논리적)
- ex) 세션 객체는 남아 있지만, 상태를 ‘만료됨’으로 바꿔서 서버가 이후 요청에서 인식하지 못하게 함
쿠키/세션 기반 인증
- 서버가 상태를 직접 기억하자!(stateful)
- 사용자가 로그인 → 서버는 내부(메모리, Redis 등)에
세션 저장소를 만들어 사용자의 상태를 저장
- 클라이언트에는 “세션 ID”만 담긴 쿠키 전달 → 이후에는 그 쿠키를 보고 서버가 세션을 찾아 인증을 처리
- 로그아웃
- 서버의 세션 정보를 삭제해야 한다.
- HttpSession.invalidate() in java
- 클라이언트의 쿠키를 폐기해야 한다.
- 세션 ID에 빈값을 제공 &
Expires(또는 Max-Age) 속성을 과거 날짜로 설정
- “서버의 세션정보 삭제 = 세션 만료” 구현하는 방법
- 자동 세션 만료
- 유휴시간 초과
- 세션에 활동이 없을 경우 세션이 활성 상태를 유지하는 시간
- 해당 세션 ID에 대해 마지막으로 HTTP 요청을 수신한 이후 정의된 유휴 시간이 지나면 세션을 닫고 무효화
- 절대시간 초과
- 세션 활동 여부와 관계없이 세션이 활성화될 수 있는 최대 시간
- 해당 세션이 처음 생성된 이후 정의된 절대 시간이 지나면 세션을 종료하고 무효화
- 갱신 시간 초과
- 세션 ID가 사용자 세션 중간에 자동으로 갱신되는 추가 갱신 시간
- 세션이 처음 생성된 이후 일정시간이 지나면 기존 세션 ID를 무효화하고 새로운 세션ID생성하여 클라이언트에 설정
- 수동 세션 만료