2011-04-29 2 views
18

개체가 일련 화되고 각 연결 (쿠키에 저장 됨)로 돌아와 사용자에게 보냈습니까?Java HttpSession 속성은 어디에 저장됩니까?

아니면 서버 힙에 저장되며 쿠키는 매우 작은 식별자일까요?

이 항목에 대한 정보는 도움이됩니다.

당신은 두 번째 추측에있어 당신에게

+0

관련 항목 : http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables/3106909#3106909 – BalusC

답변

20

감사드립니다.

쿠키에 JSESSIONID가 포함되어 있습니다. 이 ID는 서버가 유지하는 맵에서 사용자의 HttpSession을 조회하는 데 사용됩니다. 적어도 이것이 가장 일반적인 방법입니다. 서버가 이것을 구현할 수있는보다 복잡한 방법이 있지만 쿠키 전체에서 상태를 다시 왕복시키는 것은 그 중 하나가 아닙니다.

여기에는 몇 가지 의미가 있습니다. 첫째, 서버가 다운되면 세션 상태가 손실됩니다. 둘째, 서버 클러스터가있는 경우 매번 동일한 서버에 사용자를 연결해야합니다. 그렇지 않으면 후속 요청간에 세션이 손실됩니다. 마지막으로 누군가 다른 사람의 JSESSIONID를 복사하여 JSESSIONID로 바꾸는 방법을 찾으면 세션 하이재킹이 가능합니다.

+0

안전한 대안이 있습니까? –

+9

마지막 단락이 완전히 정확하지 않습니다. 인기있는 Java 웹 서버 (Tomcat 및 JBoss 이상)는 세션 상태를 디스크에 유지하도록 설정하여 충돌 또는 서버 재시작시에도 유지할 수 있습니다. 또한 동일한 서버는 클러스터의 모든 노드 사이에서 공유 세션 상태를 지원하므로 사용자가 세션의 손실없이 클러스터의 모든 노드를 누를 수 있으므로 클러스터 노드가 다운되면 다른 노드와 세션을 계속할 수 있습니다 마치 아무 일도 없었던 것처럼). – aroth

+3

@aroth - 정확합니다. 두 번째 단락은 세션이 Tomcat에서 처리되는 가장 일반적인 방법에 대한 이슈를 언급하고있었습니다. 특히 Tomcat이 세션에서 나오는 것처럼 말입니다. 필자는보다 복잡한 시스템을 언급했지만이 질문은 영구적 인/공유 된 세션의 모든 복잡함에 깊이 잠길 필요가 있다고 생각하지 않았습니다. 원래 질문을 살펴보면 세션 상태에 쿠키가 어떻게 작용했는지에 대한 설명 만 요구했습니다. 나는 의도적으로 모든 다른 가능성을 버렸다. – rfeak

5

쿠키에는 세션 식별자 (일반적으로 JSESSIONID)가 포함되어 있습니다. 서버는이 식별자를 현재 사용자 세션에 저장된 모든 데이터에 매핑합니다.

데이터 자체는 메모리에 저장되거나 사용중인 서버와 구성에 따라 데이터베이스 또는 파일로 직렬화 될 수 있습니다.

관련 문제