2011-01-29 5 views
7

사용자가 인증 할 때 세션 쿠키를 다시 설정하는 것이 좋습니다.JSESSIONID를 다시 설정하는 방법

Java로 어떻게 할 수 있습니까?

나의 시도는 지금까지 성공하지만, 더 나은 방법이 있는지 궁금 해서요 :

public static HttpSession resetSessionId(HttpSession session, 
     HttpServletRequest request) { 
    session.invalidate(); 
    session = request.getSession(true); 
    return session; 
} 
+0

나는 이것이 최선의 방법이라고 생각한다 ... –

답변

2

답변이 최적 인 것 같습니다. 또 다른 방법은 직접 방식으로 cookes 및 조작하는 것입니다 :

Cookie cookie = new Cookie ("JSESSIONID", "randomValue"); 
cookie.setMaxAge(0); 

그래서 같은 이름으로 새 쿠키를 만들고 즉시 만료,하지만 당신은 훨씬 청소기이기 때문에 나는 이런 식으로가는을하지 않는 것이 좋습니다 기본적인 서블릿 API에 익숙한 사람이라면 누구나 쉽게 알 수 있습니다.

+0

"secure"플래그를 false로 설정할 수 있기 때문에 실제로 이것을 사용할 것입니다. Tomcat은 SSL을 통해 인증했기 때문에 true로 설정했습니다. – Bozho

+0

실제로 작동하지 않았습니다. 기존의 JSESSIONID 대신 두 개의 동일한 JSESSIONID를 보냈습니다. 그래서 지금은 전체 재설정을 취소해야했습니다. 그러나 여전히 가장 많이 받아 들여진 대답을 그대로 유지하십시오. – Bozho

3

난 단지 내가 세션을 얻을 수있는 요청을 전달합니다. 세션이 아직 존재하지 않는다면 세션을 무효화하기위한 목적이 없습니다. 이는 세션이 사용자에 의해 처음으로 로그인 양식으로 요청 되었기 때문에 컨테이너에 의해 막 생성 된 경우에도 적용됩니다.

public static ... (HttpServletRequest request) { 
    HttpSession session = request.getSession(false); 
    if (session!=null && !session.isNew()) { 
     session.invalidate(); 
    } 
+0

글쎄, 세션은 인증 전에 존재해야한다 (나는 커스텀 인증을 사용하고, 내장 된 http auths는 없다). 사용자가 로그인 페이지를 열면 세션이 만들어집니다. – Bozho

+0

웹 응용 프로그램에서 세션 생성과 관련하여 매우 최적 인 것을 선호합니다. http 세션은 필요한 경우에만 Java 코드에 의해 명시 적으로 작성됩니다. 로그인 양식을 표시하는 데 대개 상태 처리가 필요하지 않습니다. – cherouvim

+0

@Bozho, cherouvim이 말한 내용은 매우 사실입니다. 인증 이전에 세션 처리 (또는 다른 상태가 필요함)는 OOM DoS에 쉽게 악용 될 수 있습니다 (세션 생성 페이지를 호출하지만 저장하지 마십시오. 정확하게 동일한 GET 요청을 실행합니다) . 그래서 이것이 가장 좋은 대답이라고 생각합니다 (덧글이있는 쪽과 함께) – bestsss

2

Tomcat (6.0.24 AFAIK 이후)은 표준 서블릿 인증 메커니즘 (기본 폼 기반 인증)을 사용하는 한 자동으로 인증시 sessionId를 변경할 수 있습니다. 이 기본 인증 자 밸브에 대한 changeSessionIdOnAuthentication를 통해 구성 할 수 있습니다 http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html

+0

감사하지만 맞춤 인증을 사용하고 있습니다. – Bozho

1

또 다른 방법 (안 더 좋은 방법) 무작위로 새로운 현재 세션의 세션 ID를 변경합니다 'changeSessionId (existingSession를)'org.apache.catalina.session.StandardManager의 호출하는 것입니다 생성 된 세션 ID.

해당 메소드를 호출하려면 StandardManager Mbean을 사용해야합니다. 참조하시기 바랍니다 Tomcat MBeans

의사 코드 :

의 ObjectName contextObjectName = 새로운 ObjectName ("카탈 : 유형 = 관리자, 경로 =/어떤 호스트 = whateverhost");

mbeanServer.invoke (contextObjectName, "changeSessionId", 새 Object [] {세션}, 새 문자열 [] { "javax.servlet.http.HttpSession"});

관련 문제