2010-02-22 7 views
31

Java 웹 응용 프로그램을 유지 관리하고 있습니다.httpservletrequest - 새 세션 만들기/세션 ID 변경

로그인 코드를 보면 HttpServletRequest에서 HttpServletRequest의 getSession() 메소드를 통해 HttpSession을 가져옵니다. (인증을 위해 세션에서 일부 값을 사용합니다.)

그러나 초기 세션을 사용한 후에 세션 고정 공격에 대해 걱정하고 있으므로 새 세션을 시작하거나 세션 ID를 변경하려고합니다. 이것이 가능한가?

답변

37

Servlet 3.0 API는 기존 세션에서 세션 ID를 변경할 수 없도록합니다. 일반적으로 세션 고정을 방지하기 위해 새 세션을 만들고 이전 세션을 무효화해야합니다.

당신이

request.getSession(false).invalidate(); 

같은 세션을 무효화하고 세션에 데이터가있는 경우 다음

분명히

getSession(true) (getSession()도 작동합니다)와 함께 새로운 세션을 생성 할 수 있습니다

계속 유지하려면 첫 번째 세션에서 두 번째 세션으로 복사해야합니다.

세션 고정 보호를 위해 인증 요청에서이를 수행하는 것이 일반적으로 괜찮은 것으로 간주됩니다. 그러나 더 높은 수준의 보안은 이전 세션을 버리고 각각의 모든 요청에 ​​대해 새로운 세션을 만드는 것입니다.

+3

이전에 getSession이 호출되지 않았 으면 NullPointerException을 제공하지 않습니까? – FRotthowe

+0

사실,하지만 세션이 있다고 가정하고 있다고 생각합니다. – pablochan

+3

'getSession (boolean) '대신에'getSession()'을 사용했다면 나는 당신을 업 그레 이드 할 것이다. – BalusC

23

Java EE 7 및 Servlet API 3.1 (Tomcat 8)부터 HttpServletRequest.changeSessionId()을 사용하면 이러한 동작을 얻을 수 있습니다. 또한 변경 될 때마다 호출되는 청취자 HttpSessionIdListener이 있습니다.

+0

Shiro와 changeSessionId는 강력한 조합입니다. 그것은 내가 산만하지 않고 나의 용암 논리를 쓸 수있게 해준다. '(성공) request.changeSessionId()'다시 쓸 필요가 없다. 나는 네임이다. – lrn2prgrm