본문 바로가기

Define Java/Java

세션 강제 종료(강제 로그 아웃)


Servlet 버젼이 올라 감으로 HttpSession에서 HttpSessionContext을 가져오는 메소드인 getSessionContext를 사용 못하게 되었다.
실제 사용을 하면 객체을 반환을 하기는 하지만 객체 안에 세션은 비워져 있다.

문서를 뒤져 보니 보안 관계상 사용을 못한다고 어쩌고 적혀 있기는 하는데.....그래도 관리자가 강제 로그아웃 시키거나 세션을 지워줘야 할 경우가 있을 것 같아서 고민끝에 편법을 하나 생각 해 냈다.(Jeus에서는 된다는 말도 있음)

HttpSessionContext 사용이 가능 하다면 HttpSessionContext .getSession(아이디)를 사용하여 세션 객체를 반환받고 HttpSession.invalidate() 메소드를 호출 하면된다.

HttpSessionContext 사용이 불가능 하다면 아래 소스와 같이 jsessionId값을 뒤쪽에 붙여 보내에 해당 세션으로 연결 시켜서 로그 아웃을 실행 하면 된다.


call.jsp

String jsessionId = "288B29804635D51357A52F6CCF25617B";
BufferedReader in = null;
String address = "http://me:8080/cms/logout.jsp;jsessionid="+ jsessionId;
try
{
 URL url = new URL(address);
 in = new BufferedReader(new InputStreamReader(url.openStream()));
 String line = in.readLine();
 in.close();
} catch (Exception e) {
 System.out.println("-.-;;");
}
in = null;

logout.jsp
System.out.println(session.getId());
 session.invalidate();

이 편법은 Session Hijacking이라는 다른 사람의 세션을 훔치는 방법을 응용한 방법이다.

약간의 문제가 있을 수도 있지만 우선은 이렇게 처리했다.

jsessionId값을 모르면 아무 소용이 없기 때문에 HttpSessionListener를 구현하여 세션이 생성되고 세션을 종료 되는 시점을 체크 하여 특정 저장 공간에 세션아이디 값과 아이피등 여러 정보를 저장 해 놓고 사용 하면된다.