2017-10-11 3 views
0

브라우저 동작을 에뮬레이션하는 Java 코드가 있습니다. 예를 들어, login, doSomething, logout과 같이 Tomcat 서버와의 상태 저장 대화를 수행합니다.톰캣 웹 서버와 대화하는 동안 JSESSIONID가 변경되는지 확인해야합니까?

현재의 구현은 다음과 같다 :

  1. HTTP 포스트에 "로그인"페이지, 저장소가 쿠키를 반환 (은 = 9845 JSESSIONID의 가정).
  2. HTTP 포스트는 "해봐요"페이지 쿠키를 저장 합격 (= 9845 JSESSIONID) 요청과 응답 헤더 (무시 더 쿠키)와 함께 아무것도 할
  3. HTTP GET (JSESSIONID 저장된 쿠키를 통과, 페이지를 "로그 아웃"을 = 9845)를 요청합니다.

괜찮습니다.

2 단계에서 응답 헤더를 무시하는 것이 안전한지 잘 모르겠습니다. 대화 중에 서버가 을 JSESSIONID로 변경해야합니까?

즉, 2 단계에서 수행 할 작업은 무엇입니까? 서버는 응답 헤더에 Set-Cookie = [JSESSIONID = 9846]을 반환합니까?

나는 다음을 상상할 수 :

  1. 이 실제 생활에서 일어날 수없는이, 가치가 그것을 확인하기 위해, 현재 코드는 괜찮습니다.
  2. 이것은 톰캣 서버에 심각한 문제가 있음을 보여 주며 확인해 볼 가치가 있으며 코드는 추가 호출없이 대화를 중단해야합니다.
  3. 톰캣 서버는 세션에 대한 새로운 식별자를 사용하기를 원하므로 새 값을 저장하고 후속 호출에서 사용하십시오. 현재 코드가 완료되어야합니다.

실제 브라우저는 위의 3 가지 옵션을 사용하지만 1과 2를 함께 사용하는 것 같습니다. 2. 옵션도 사용할 수 있습니까?

+0

실제 브라우저는 3 일 것입니다. tomcat이 실제로 세션 번호를 다시 매길 지 여부는 다른 문제입니다. ** 세션 무효화 **를 제외하고는 - 로그 아웃이 아닌 것 같습니다. –

답변

1

일반적으로 로그인 및 로그 아웃시 세션이 변경되므로 안전하다고 크게 기대할 수 있습니다 (단, 읽기 만하고 "일반적으로"라고만 말함). HTTP 스펙을 무시하는 것이 안전한지 묻는다면, 인프라 스트럭처를 유지 보수하거나 업그레이드하는 데 예기치 않은 변경이있을 수 있으므로 항상 그렇지 않습니다.

다음과 같은 것들을 찾기가 어렵습니다. 언젠가 끈끈한 세션이있는 클러스터에 앱을 배포하기 시작하면 tomcat은 세션 ID를 클러스터 컴퓨터에 태그 지정합니다 (예 : 세션 식별자는 9846;node3처럼 보일 것입니다. 이는 여전히 일반적으로 변경되지 않지만 노드 3이 종료되고 다음 요청이 다른 노드 (노드 9846;node1)에 대해 다시 균형을 조정하게됩니다.

"로그인, 할 일, 로그 아웃"작업이 항상 반자성 (예 : 서로 즉시 이어짐) 인 경우 세 가지 요청 사이에서 노드 3의 가능성이 무시 될 수 있습니다. 세션을 잠시 동안 열어두면 그러한 이벤트를 방해 할 수 있습니다.

요약 : HTTP 사양을 무시하는 것이 좋습니다? 아닙니다. 그렇게 할 가능성이 가장 큽니까? 당신이 결정합니다. 나는 아마 몇 년 전에 당신을 물 것입니다 한 예를 들었습니다. 쉽게 빠져 나갈 수 있습니다. 사양을 무시하면 구현이 훨씬 쉬워집니다 (유지 관리하기가 쉽습니다).그러나 미래에 나타날 때 문제가 겉으로보기에 무작위로 드물기 때문에 실수를 쉽게 발견 할 수 없습니다. 디버깅의 악몽.

+0

고맙습니다 올라프, 나는 정확히 이것과 비슷한 것을보고있었습니다! 세션 복제를 사용한 고정 세션은 로그인 후 JSESSIONID 변경 사항을 무시하여 http 스펙을 무시하는 것이 위험한 실제 시나리오입니다. 이제 나는 이것을 고치기위한 좋은 주장을했습니다, 감사합니다! – riskop

+0

이 경우에 대한 부수적 인 참고 사항입니다. 클러스터가 node3이 종료 된 후 JSESSIONID = 9845; node3을 node3에 연결하여 수신 'dosomething'요청을 보낼 수 있으면 JSESSIONID = 9845; node3과 함께 오는 추가 요청을 작업 노드로 보낼 수 있다고 생각합니다. 그래서 저는 클라이언트가 세션 쿠키의 라우트 부분이 변경되었음을 알지 못하고 세션을 올바르게 마칠 수 있다고 확신합니다. 그러나이 시나리오는 세션 쿠키가 상태 저장 대화 중에 값을 변경하는 경우에 대한 좋은 예입니다. – riskop

관련 문제