출처사이트 :
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kyong94s&logNo=119737344
물리적으로 이중화되어 분리된 WAS 서버환경에서 로그인 세션을 관리(등록, 삭제)하는 방법은 세 가지로 정리할 수 있습니다.
- 데이터베이스 기반 로그인 세션관리 (중복로그인방지기능 구현가능)
- WAS에서 제공하는 세션서버나 Security Framework 기반 로그인 세션관리
- SSO/EAM Agent-Server 기반 세션관리
위의 세 가지 세션관리방법에 대하여 상세하게 정리하도록 하겠습니다.
1. 데이터베이스 기반 로그인 세션관리
데이터베이스를 기반으로 로그인된 세션정보를 관리하면 물리적으로 분리된 시스템(WAS)간에 세션을 공유하여 중복로그인이나 특정 세션 강제종료와 같은 세션에 대한 관리가 가능합니다. 데이터베이스 기반 로그인 세션관리방법은 다음 순서에 따라 개발을 진행합니다.
1) 데이터베이스에 로그인 세션에 대한 정보를 저장하기 위한 테이블을 생성한다. (예: 테이블명 - LOGIN_SESSION_INFO)
- 오라클DB인 경우
CREATE TABLE LOGIN_SESSION_INFO (
SESSION_ID VARCHAR2(50) NOT NULL,
USER_ID VARCHAR2(20) NOT NULL,
LOGIN_TIME VARCHAR2(20) NOT NULL,
PRIMARY KEY (SESSION_ID)
);
CREATE INDEX USER_ID_IDX
ON LOGIN_SESSION_INFO (USER_ID);
-- 각 컬럼에 대한 데이터형, 크기와 테이블명은 개발하고자 하는 시스템의 특징에 따라 변경할 수 있습니다.
-- LOGIN_TIME은 DB서버의 시간이 아니라 로그인 시 WAS에서 제공하는 시간을 입력합니다.
2) 데이터베이스로 로그인 세션정보를 관리하는 SessionManager를 개발합니다.
- public interface SessionManager
- public class CachedDatabaseSessionManager implements SessionManager
- SessionManager를 사용하지 않고 좀더 간단하게 javax.servlet.http.* 패키지에 있는 HttpSessionBindingListener, HttpSessionListener,HttpSessionAttributeListener 인터페이스를 구현하여 로그인하고 로그아웃할 때 데이터베이스 테이블에 값을 설정하고 비교하는 방법으로 데이터베이스 기반 로그인 세션관리를 구현할 수 있습니다.
3) 로그인 시 필요한 정보를 세션ID를 기반으로 세션에 저장하고 SessionManager를 통해 데이터베이스에 세션ID와 사용자ID를 등록(insert)합니다.
4) 관리자는 세션관리화면에서 세션관리 테이블의 데이터를 조회하고 종료하고자 하는 사용자의 세션에 대한 종료를 서버에 요청합니다. 요청 시 사용자ID를 함께 전달합니다.
5) 요청을 받은 웹 어플리케이션은 [세션ID로 세션 획득하는 방법]을 이용하여 사용자ID로 해당 세션을 강제종료합니다.
- 세션ID로 세션 획득하는 방법
// 세션에서 세션컨텍스트를 얻어온다. (컨텍스터를 이용해서 세션의 ID 전체를 가져오기 위해서)
HttpSessionContext sessionContext = session.getSessionContext();
// 위의 세션컨텍스트를 이용해서 전체 세션ID를 획득한다.
Enumeration sessionIds = sessionContext.getIds();
// 최신의 상태가 아닌 세션을 검색하기위해 세션ID를 살펴봄..
while (sessionIds.hasMoreElements()) {
String sessionId = (String)sessionIds.nextElement();
System.out.println("Checking " + sessionId + "...."); // 세션의 ID가 나오겠죠...
HttpSession session = sessionContext.getSession(sessionId);
. . .
String userId = (String) session.getValue("user_id");
//여기에서 획득한 사용자 ID가 세션을 강제종료해야 할 사용자 ID와 같다면 해당 세션을 invalidate()합니다.
}
여기에서 HttpSessionContext는 서블릿 2.1 이후로 deprecated된 스팩이지만 Jeus 5.0 라이브러리에는 해당 구현체가 포함되어 있으므로 문제없이 구동될 것입니다.
6) 만약 강제종료된 세션의 사용자가 다시 요청하면 웹 어플리케이션에서 요청을 거부하게 됩니다.
2. WAS에서 제공하는 세션서버나 Security Framework 기반 로그인 세션관리
Jeus5.X에 대한 설정내용은 아래의 TMAX 가이드를 참조합니다.
http://technet.tmax.co.kr/kr/edocs/jeus/60/server/chapter_session_server.html
이 가이드를 통해 세션서버 구성이 완료되면 위의 [세션ID로 세션 획득하는 방법]을 참조하여 세션관리 화면에서 특정 사용자의 세션을 종료할 수 있습니다.
세션서버 기반으로 세션이 통합관리되므로 물리적으로 분리되어 이중화된 WAS에서 세션정보를 공유하게 됩니다. 따라서 강제적으로 종료된 세션을 사용하던 사용자의 요청은 거부당하게 됩니다.
대체방안으로 Spring Security Framework와 같이 통합 세션관리 기능을 제공하는 웹 어플리케이션 프레임워크를 적용할 수 있습니다.
3. SSO/EAM Agent-Server 기반 세션관리
대부분 SSO/EAM 솔루션의 Agent-Server를 기반으로 제공되는 세션관리를 활용할 수 있습니다.
물론 솔루션에 대한 비용이 발생하게 됩니다.
댓글