참고글
웹어플리케이션(ServletContext)과 세션(Session)의 관계
서블릿 컨테이너는(예를 들어 톰캣) 여러개의 웹어플리케이션을 배포할 수 있습니다. 웹어플리케이션은 서블릿 컨테이너의 webapps 디렉터리 하위에 배포되는데 webapps/ROOT/ 경로로 배포되면 컨텍스트 경로는 localhost/ 와 같이 '/' 경로로 배포되며, webapps/jspStudy 와 같이 배포되면 컨텍스트 경로는 localhost/jspStudy/가 됩니다.
즉 webapps 하위의 배포 디렉터리별로 웹어플리케이션의 단위가 결정되는것입니다. 그리고 각각의 웹 어플리케이션은 javax.servlet.ServletContext 구현체(이하 ServletContext)를 통해 다룰 수 있게 됩니다. 위의 그림을 보시면 조금 더 이해가 되실것입니다.
세션(Session)쿠키와 세션 범위
Jsp/Servlet에서 세션은 웹 어플리케이션 안에서의 범위를 갖게 됩니다. 세션 객체 자체는 서버측에 생성되지만 세션을 구분할 때 사용하는 SESSION ID 자체는 기본적으로 JSESSIONID라는 쿠키를 통해 구분하게 되는데, 이 쿠키의 경로가 웹 어플리케이션 경로를 갖기 때문입니다.
테스트를 위해 다음의 예제를 보도록 합니다. 프로젝트는 다음과 같이 구성되는데 단순히 sessionTest.jsp라는 하나의 페이지를 갖는 프로젝트입니다.
sessionTest.jsp 이며, 현재 접속한 브라우저의 세션ID값을 보여줍니다.
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
</head>
<body>
<h3>세션 ID : <%= session.getId() %></h3>
</body>
</html> |
cs |
그리고 이 웹 프로젝트를 복사하여 톰캣의 webapps 하위에 ROOT와 jspStudy 경로로 배포하도록 합니다. 혹은 이클립스 환경이라면 server 설정의 Web Modules 설정을 아래와 같이 변경합니다.
이제 이 톰캣서버에는 '/' 경로와 '/jspStudy' 경로에 두개의 웹어플리케이션이 생성되었습니다. 이제 각각의 주소에 있는 sessionTest.jsp 를 호출합니다. 각각의 경로는 /sessionTest.jsp와 /jspStudy/sessionTest.jsp입니다.
각각 페이지를 호출해보면 알겠지만 하나의 서버였다고 하더라도 다른 세션이 맵핑된것을 볼 수 있습니다. 이는 서블릿 컨테이너에서 세션을 생성하고 해당 세션에 대한 세션쿠키의 path값을 각각의 웹어플리케이션 경로로 지정하기 때문입니다. 다음은 HTTP 응답메시지를 통해 세션쿠키의 path값을 비교한 것입니다.
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=ED92A8FAA8000F9D5B0926ABE51B980A; Path=/; HttpOnly
Content-Type: text/html;charset=utf-8
Content-Length: 110
Date: Thu, 03 Jan 2019 06:25:25 GMT
path의 범위가 다르다는것을 알 수 있습니다.
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=678B079670E8B3378E6F55B14FC80683; Path=/jspStudy; HttpOnly
Content-Type: text/html;charset=utf-8
Content-Length: 110
Date: Thu, 03 Jan 2019 06:25:18 GMT
웹어플리케이션 경로와 디렉터리 경로(URL)이 겹치는 경우
만약 ROOT에 배포한 웹 어플리케이션에 jspStudy라는 디렉터리를 생성 후 sessionTest.jsp 파일을 복사해두면 어떻게 될까요? 만약 그렇게 한 후에 /jspStudy/sessionTest.jsp 를 호출한다면 이때는 ROOT 웹 어플리케이션이 아닌 jspStudy 웹어플리케이션의 sessionTest.jsp가 우선순위를 갖게 되어 /jspStudy에 속해있는 세션이 출력됩니다.
'Servlet&Jsp' 카테고리의 다른 글
[서블릿/JSP] 필터(Filter)란? 필터 개념 및 설명 (0) | 2019.01.08 |
---|---|
[서블릿/JSP] 필터를 여러개 등록하는 방법 및 순서 지정하기 (0) | 2019.01.08 |
[서블릿/JSP] 세션을 이용한 로그인, 로그아웃 구현하기 (0) | 2019.01.02 |
[서블릿/JSP] HttpServletResponse의 sendRedirect() 사용시 문제점 (0) | 2018.12.26 |
[서블릿/JSP] 요청 파라미터 한글 인코딩 처리 필터(Filter) 구현하기 (1) | 2018.12.25 |