HTTP 세션 사용을 위한 우수 사례
이 주제는 HTTP 세션 구현을 위한 우수 사례를 제공합니다.
- HTTP 세션 보안을 위한 보안 통합 사용
HTTP 세션은 세션 ID에서 식별됩니다. 세션 ID는 런타임 중 생성되는 유사 난수입니다. 세션 가로채기는 공격용 HTTP 세션으로 알려져 있으며 네트워크에서 일어나는 요청 모두가 보안 연결(HTTPS)을 거치도록 강제하면 방지할 수 있습니다. 그러나 고객 환경 중 구성 모두가 이 제한조건을 실행하지는 않는데, SSL(Secure Socket Layer) 연결이 성능에 미치는 영향 때문입니다. 이 릴렉스된 모드 때문에, HTTP 세션은 하이잭킹에 취약하고 이 취약성 때문에 WebSphere® Application Server는 HTTP 세션과 WebSphere Application Server 보안을 밀접하게 통합하는 옵션이 있습니다. WebSphere Application Server의 보안 사용은 세션을 작성한 사용자만이 액세스할 수 있도록 허용하는 방식으로 세션이 보 호됩니다.
- 완료 시
javax.servlet.http.HttpSession.invalidate()를 사용하여 HttpSession 오브젝트를 릴리스하십시오. HttpSession 오브젝트는 다음이 수행될 때까지 웹 컨테이너 내에 상주합니다.
- 애플리케이션은 javax.servlet.http.HttpSession.invalidate 메소드를 사용하여 명시적 및 프로그램 방식으로 오브젝트를 해제합니다. 따라서 빈번한 프로그램 방식인 무효화는 애플리케이션 로그아웃 기능의 파트가 됩니다.
- WebSphere Application Server는 만기가 되면(기본값 = 1800초 또는 30분) 할당된 HttpSession을 영구 삭제합니다. WebSphere Application Server는 세션 관리 설정을 기반으로 메모리에 특정 개수의 HTTP 세션만 유지보수할 수 있습니다. 분산 세션의 경우, 메모리에서 최대 캐시 한계에 이르면 세션 관리 기능이 가장 최근에 사용한(URL) 것을 캐시에서 제거하여 세션을 위한 공간을 작성합니다.
- 각 서블릿이나 JSP 파일 외부에서 HttpSession 오브젝트를 저장하여 다시 사용하지
않도록 하십시오.
HttpSession 오브젝트는 HttpRequest의 함수이고(req.getSession 메소드를 통해서만 가져올 수 있음), 이 사본은 Servlet 또는 JSP 파일의 service 메소드가 지속되는 동안에만 유효합니다. HttpSession 오브젝트를 캐시할 수 없고 Servlet 또는 JSP 파일의 범위 밖에서 이 오브젝트를 참조할 수 없습니다.
- HTTP 세션에 저장할 새 오브젝트를 개발할 때 java.io.Serializable 인터페이스를
구현하십시오.
클래스의 직렬화 가능성은 java.io.Serializable 인터페이스를 구현하는 클래스에서 사용할 수 있습니다. java.io.Serializable 인터페이스 구현은 분산 세션을 사용할 때 오브젝트는 적절하게 직렬화될 수 있습니다. 이 인터페이스를 구현하지 않는 클래스는 직렬화 또는 직렬화 해제된 상태를 갖지 못합니다. 그러므로 클래스가 직렬화 가능 인터페이스를 구현하지 않으면 JVM은 데이터베이스 또는 다른 JVM에서 상태를 지속할 수 없습니다. 직렬화 가능 클래스의 모든 하위 유형이 직렬화 가능합니다. 예를 들면, 다음과 같습니다.
public class MyObject implements java.io.Serializable {...}
일시적으로 표시되지 않은 모든 인스턴스 변수 오브젝트가 직렬화 가능한지 확인하십시오. 직렬화 해제 가능 오브젝트를 캐시할 수 없습니다.
Java™ 서블릿 스펙에 따라, 컨테이너가 저장하는 세션의 마이그레이션에 필요한 메커니즘을 지원할 수 없으면 분배된 서블릿 컨테이너는 오브젝트에 대해 IllegalArgumentException을 작성해야 합니다. 분산 가능을 선택한 경우에만 예외가 작성됩니다.
- 세션 상태 장애 복구를 사용할 경우 <codeph>write frequency=END_OF_SERVICE</codeph>를 사용하면 데이터베이스 또는 WebSphere eXtreme Scale의 장애를 복구하는 동안 데이터 유실을 방지할 수 있습니다. 개별 요청 종료 시 세션 데이터가 데이터베이스 또는 데이터 그리드에 저장되므로 데이터 유실이 방지됩니다. 이 동작의 결과로 요청 시간이 더 길어지고 성능이 저하됩니다.
- 세션에 추가하는 Java 오브젝트가 정확한 클래스 경로에 있다는 것을
확인하십시오.
Java 오브젝트를 세션에 추가하면, 해당 오브젝트의 클래스 파일을 올바른 클래스 경로(엔터프라이즈 애플리케이션의 웹 모듈에서 공유를 이용하는 경우 애플리케이션 클래스 경로 또는 Servlet 2.2-준수 세션 공유를 사용하는 경우 웹 모듈 클래스 경로)에 배치하거나 WebSphere Application Server에서 사용된 다른 서블릿을 포함한 디렉토리에 배치하십시오. 세션 클러스터링 경우 이 조치는 클러스터의 모든 노드에 적용됩니다.
HttpSession 오브젝트가 사용자가 액세스할 수 있는 서블릿 사이에서 공유되므로, 충돌을 피하기 위해 사이트 전역의 이름 규칙 채택을 고려하십시오.
- HttpSession 오브젝트에서 대용량 오브젝트 그래프를 저장하지 않도록 하십시오.
대부분의 애플리케이션에서 각 Servlet은 세션 데이터 총계의 단편만을 요구합니다. 그러나, 큰 오브젝트로서 데이터를 HttpSession 오브젝트에 저장하여 애플리케이션이 WebSphere Application Server가 매번 강제로 모든 데이터를 처리하도록 합니다.
- WebSphere Application Server에서 더 높은
캐시 적중률을 달성하는 데 도움을 주는 세션 선호도를 이용하십시오.
WebSphere Application Server의 HTTP Server 플러그인에는 세션 선호도를 도와주는 기능이 있습니다. 플러그인은 브라우저에서 쿠키 데이터(또는 인코드된 URL)를 읽고 해당 애플리케이션 또는 지정된 세션 키에 기반한 복제본에 요청을 지정할 수 있도록 도와줍니다. 이 기능은 인메모리 캐시의 사용을 늘리고, 데이터베이스나 다른 WebSphere Application Server 인스턴스에 대한 적중률을 줄입니다.
- 세션 선호도의 사용을 극대화하고 선호도를 제거하지 않도록 하십시오.
세션 선호도를 적절하게 사용하면 WebSphere Application Server의 성능을 개선할 수 있습니다. WebSphere Application Server 환경의 세션 선호도는 세션 오브젝트의 인메모리 캐시를 최대화하고 데이터베이스나 다른 WebSphere Application Server 인스턴스를 읽을 양을 줄입니다. 사용자가 상호 작용하는 애플리케이션의 서버 인스턴스에 세션 오브젝트를 캐시하면 세션 유사성이 작동합니다. 애플리케이션이 서버 그룹의 다중 서버에 배치된 경우, 애플리케이션은 사용자를 서버 중 하나로 안내할 수 있습니다. 사용자가 server1에서 시작한 다음 잠시 뒤 server2에 들어올 경우, 서버는 server2가 실행 중인 서버 인스턴스가 데이터베이스를 읽을 수 있도록 세션 정보를 모두 외부 위치로 작성해야 합니다. 세션 유사성을 사용하여 이 데이터베이스 읽기를 피할 수 있습니다. 세션 유사성을 사용하는 경우, 사용자는 첫 번째 요청에 대해 server1에서 시작하고 이후 모든 연속적인 요청에 대해 사용자를 다시 server1로 안내합니다. Server1은 세션 정보를 가져오려면 캐시만 살펴보아야 하고 정보를 가져오기 위해 세션 데이터베이스에 대한 호출을 수행하지 않아야 합니다.
세션 유사성을 제거하지 않음으로써 성능을 향상시킬 수 있습니다. 세션 유사성 제거를 방지하는 방법은 다음과 같습니다.- 모든 웹 애플리케이션을 단일 애플리케이션 서버 인스턴스에 결합시키고(가능한 경우) 장애 복구 지원을 제공하도록 모델링 또는 복제를 사용하십시오.
- 프레임 페이지의 세션은 작성하지만 다중 프레임 JSP 파일을 사용할 때 프레임 내 페이지의 세션은 작성하지 마십시오. (나중에 이 주제를 참조하십시오.)
- 다중 프레임 페이지를 사용할 때 다음 가이드라인을 따르십시오.
- 한 프레임에서만 또는 프레임 세트에 액세스하기 전에 세션을 작성하십시오. 예를 들어, 브라우저와 연관된 세션이 아직 없고 사용자가 다중 프레임 JSP 파일에 액세스한다고 가정할 때 브라우저는 JSP 파일에 대한 동시 요청을 실행합니다. 요청은 세션의 파트가 아니기 때문에 JSP 파일은 다중 세션 작성을 종료하고 모든 쿠키는 브라우저로 다시 전송됩니다. 브라우저는 도착한 마지막 쿠키만 인정합니다. 따라서 클라이언트는 마지막 쿠키와 연관된 세션만 검색할 수 있습니다. JSP 파일을 이용하는 다중 프레임 페이지에 액세스하기 전에 세션을 작성하는 것이 좋습니다.
- 기본적으로, JSP 파일은 request.getSession(true) 메소드를 사용하여 HTTPSession을 가져옵니다. 따라서 JSP 파일은 기본적으로 클라이언트용으로 존재하는 세션이 없다면 새 세션을 작성합니다. 브라우저의 각 JSP 페이지는 새 세션을 요청하지만 브라우저 인스턴스당 한 개의 세션만 사용됩니다. 개발자는 <% @ page session="false" %>를 사용하여 세션에 액세스하지 않는 JSP 파일에서 자동 세션 작성을 끌 수 있습니다. 그런 다음, 페이지에서 세션 정보에 대한 액세스를 필요로 할 경우, 개발자는 <%HttpSession session = javax.servlet.http.HttpServletRequest.getSession(false); %>를 사용하여 JSP 파일을 작성하는 원래 세션으로 작성된 기존 세션을 가져올 수 있습니다. 이 조치는 프레임 페이지의 초기 로드 중에 세션 유사성이 파괴되지 않도록 해줍니다.
- 한 개의 프레임만 사용하여 세션 데이터를 업데이트하십시오. 프레임세트를 사용할 때 동시에 요청이 HTTP Server로 들어옵니다. 세션 변경사항을 동시 프레임세트의 세션 변경사항으로 겹쳐쓰지 않도록 한 프레임 내에서만 세션 데이터를 수정하는 것이 좋습니다.
- 프레임이 다른 웹 애플리케이션을 가리키는 다중 프레임 JSP 파일을 사용하지 마십시오. 첫 번째 웹 애플리케이션의 JSESSIONID 쿠키는 두 번째 웹 애플리케이션이 작성한 JSESSIONID로 겹쳐쓰여지므로 이 조치를 취하면 다른 웹 애플리케이션에서 작성한 세션은 유실됩니다.
- 보안 통합을 사용 가능하게 한 상태에서 세션을 사용하는 JSP 파일이나 서블릿에 보안을 적용하면 모든 페이지(일부가 아닌)를 보안하십시오.
보안 및 세션이 적용될 때 파일 전부이거나 전부가 아닙니다. 시간의 일부만 세션 상태 액세스를 보호하는 것은 합리적이지 않습니다. 세션 관리 기능에서 보안 통합이 사용 가능할 때 세션이 작성되거나 액세스되는 모든 자원은 보안되거나 보안되지 않아야 합니다. 보안된 자원과 보안되지 않은 자원을 혼합할 수 없습니다.
두세 페이지만 보안하는 데 대한 문제점은 보안된 페이지에 작성된 세션이 인증된 사용자 ID에 따라 작성된다는 점입니다. 동일한 사용자만 다른 보안된 페이지의 세션에 액세스할 수 있습니다. 인증되지 않은 사용자가 이 세션을 사용하지 못하게 보호하려면, 보안되지 않은 페이지에서 이 세션에 액세스할 수 없습니다. 보안되지 않은 페이지에서 요청이 발생할 때, 액세스는 거부되고 UnauthorizedSessionRequestException 오류가 작성됩니다. (UnauthorizedSessionRequestException은 런타임 예외이고, 로그됩니다.)
- 세션 데이터를 읽는 애플리케이션에서 수동 업데이트 및 sync() 메소드 또는
시간순으로 쓰기를 사용하고 종종 업데이트하십시오.
END_OF_SERVICE 쓰기 빈도로 애플리케이션이 세션을 사용하고 언제든지 해당 세션에서 데이터를 읽거나 쓸 때, LastAccess 시간 필드가 업데이트됩니다. 데이터베이스 세션이 사용되는 경우, 데이터베이스에 새로운 쓰기가 생성됩니다. 이 활동은 수동 업데이트 옵션 사용을 방지하고 레코드의 모든 읽기 또는 쓰기에 대해서가 아니라 데이터 값이 업데이트할 때만 데이터베이스에 다시 레코드를 쓰지 못하게 할 수 있는 성능 적중률입니다.
수동 업데이트를 사용하려면 세션 관리 서비스에서 이 옵션을 켜십시오. (위치 정보는 위의 표를 참조하십시오.) 또한 애플리케이션 코드는 일반 HttpSession 대신 com.ibm.websphere.servlet.session.IBMSession 클래스를 사용해야 합니다. IBMSession 오브젝트 내에는 동기화 메소드가 있습니다. 이 메소드는 WebSphere Application Server에 세션 오브젝트의 데이터를 데이터베이스에 작성할 것을 명령합니다. 이 활동은 개발자가 필요할 때만 세션 정보를 지속하도록 하여 전반적인 성능을 향상시킬 수 있도록 해줍니다.
참고: 수동 업데이트를 사용하는 또다른 방법은 여러 시간 간격으로 데이터를 지속하는 시간이 정해진 업데이트를 이용하는 것입니다. 이 조치는 수동 업데이트 설계와 유사한 결과를 제공합니다. - 고성능을 확보할 수 있도록 다음 사항을 구현하십시오.
- 애플리케이션이 세션 데이터를 자주 변경하지 않는 경우, 수동 업데이트 및 동기화 함수(또는 시간이 정해진 간격 업데이트)를 사용하여 세션 정보를 효율적으로 지속하십시오.
- 세션에 저장된 데이터 양을 최대한 적게 유지하십시오. 데이터 보관을 위한 세션 사용의 용이성으로, 지나치게 많은 양의 데이터가 세션 오브젝트에 저장되는 경우가 있습니다. 세션을 효율적으로 사용하려면 데이터 기억장치 및 성능의 적절한 밸런스를 판별하십시오.
- 데이터베이스 세션을 사용하는 경우, 세션 데이터베이스에 대해 전용 데이터베이스를 사용하십시오. 애플리케이션 데이터베이스 사용을 피하십시오. 그러면 JDBC 연결에 대한 경합을 피하고 데이터베이스 성능을 더 좋게 할 수 있습니다.
- 메모리 대 메모리 세션을 사용하는 경우, 클러스터의 크기가 증가하고 배율이 줄어들 때 파티션화(그룹 또는 단일 복제)를 채택하십시오.
- WebSphere Application Server용 최신 수정팩이 있는지 확인하십시오.
- 세션 성능을 모니터하는 데 도움이 되는 다음 도구를 사용하십시오.
- com.ibm.servlet.personalization.sessiontracking.IBMTrackerDebug Servlet을 실행하십시오. - 이 서블릿을 실행하려면, 이를 실행하려는 웹 애플리케이션에 실행 중인 서블릿 호출자가 있어야 합니다. 또는 실행하려는 애플리케이션에서 이 Servlet을 명확하게 구성할 수 있습니다.
- WebSphere Application Server와 함께 제공되는 WebSphere Application Server Resource Analyzer를 사용하여 WebSphere Application Server 환경의 활성 세션 및 통계를 모니터하십시오.
- DB2®에서 "모니터링"과 같은 데이터베이스 추적 도구를 사용하십시오. (사용된 데이터베이스 시스템의 관련 문서를 참조하십시오.)