개요
스프링의 HttpSession에서 동일한 key로 getAttribute()를 호출하더라도, 클라이언트 별로 구분할 수 있는 이유는 각 클라이언트마다 고유한 세션이 있기 때문이다. 이 고유한 세션은 클라이언트와 서버 간의 일대일 연결을 유지하고, 각 클라이언트의 상태를 서버 측에서 유지 관리할 수 있도록 해준다.
세션의 기본 원리
- 세션 생성: 클라이언트가 서버에 처음으로 요청을 보낼 때, 서버는 새로운 세션을 생성한다. 이 세션은 보통 서버 측에서 HttpSession 객체로 관리된다.
- 세션 ID 부여: 세션이 생성될 때, 서버는 고유한 세션 ID를 생성하고, 이를 클라이언트에게 전달한다. 이 세션 ID는 보통 쿠키에 저장되며 JSESSIONID라는 이름으로 전송된다.
- 세션 유지: 클라이언트는 이후의 모든 요청에 이 세션 ID를 포함시켜 서버에 전송한다. 서버는 이 세션 ID를 통해서 어떤 클라이언트가 요청을 보냈는지 식별하고, 해당 클라이언트의 세션에 접근할 수 있다.
세션 유지 방법
- 쿠키: 대부분의 경우 세션 ID는 쿠키에 저장되어 클라이언트와 서버 간의 요청과 응답을 통해 전송된다. 클라이언트는 다음 요청 시 이 쿠키를 포함하여 서버에 전달한다.
- URL Rewriting: 쿠키를 사용할 수 없는 환경에서는 URL에 세션 ID를 포함시켜 전송하기도 한다.
- http://localhost:8080/;jsessionid=F59911518B921DF62D09F0DF8F83F872
동일한 key로 getAttribute()를 해도 클라이언트 별로 구분할 수 있는 이유
- 세션 ID로 세션 식별
- 각 클라이언트는 고유한 세션 ID를 가지고 있으며, 서버는 이 세션ID를 통해 클라이언트를 식별한다.
- 클라이언트별 고유 세션 객체
- 각 클라이언트는 자신의 세션 객체를 가지고 있다. 따라서, 동일한 key로 getAttribute()를 호출하더라도 각 클라이언트는 자신의 세션 객체 내의 데이터를 읽게된다.
예를 들어, 두 클라이언트 A, B가 있다고 가정해보자.
- 클라이언트 A가 session.setAttribute("user", "Alice")를 호출하면, A의 세션 객체에 "user"라는 key로 "Alice"가 저장된다.
- 클라이언트 B가 session.setAttribute("user", "Bob")을 호출하면, B의 세션 객체에 "user"라는 key로 "Bob"이 저장된다.
- 이후 클라이언트 A가 session.getAttribute("user")를 호출하면 "Alice"가 반환되고, 클라이언트 B가 session.getAttribute("user")를 호출하면 "Bob"이 반환된다.
따라서, 동일한 key로 getAttribute()를 호출하더라도, 각 클라이언트는 자신의 세션 객체에서 값을 가져오기 때문에 클라이언트 별로 구분이 가능하다.
반응형