이전글



쿠키의 path 속성 및 속성에 따른 쿠키 전송 규칙
쿠키의 path 속성을 이용하면 웹서버의 특정 URL에 대해서만 쿠키를 전송할 수 있습니다. path 속성은 웹서버의 디렉터리 단위로 지정이 가능하며, 디렉터리를 지정하면 지정한 해당 디렉터와 그 하위 경로에만 쿠키가 전송됩니다. 디렉터리 단위라는것은 URL 경로상에 / (슬래쉬)로 구분되어지는 단위를 말합니다.

예를 들어 다음과 같이 웹 어플리케이션의 경로가 구성된 경우 쿠키의 path 값을 /subDir1/ 으로 지정하면 localhost:8080/subDir1/xx.jsp 와 같이 subDir1 하위 경로로 요청시에만 쿠키가 전송됩니다.

만약 path값을 /subDir2/로 지정하면 localhost:8080/subDir2/xx.jsp 또는 localhost:8080/subDir2/subDir3/xx.jsp 과 같은 경로로 요청시에만 쿠키가 전송됩니다. 그러나 path값을 /subDir2/subDir3/ 으로 지정하는 경우에는 localhost:8080/subDir2/xx.jsp 와 같이 요청하는 경우에는 상위 디렉터리이므로 쿠키가 전송되지 않습니다.

만약 쿠키의 path값을 따로 설정하지 않는 경우 쿠키를 생성했던 페이지의 경로에만 쿠키가 전송됩니다. 예를 들어 localhost:8080/subDir2/setCookie.jsp 에서 쿠키가 생성되었다면 localhost:8080/subDir2/ 디렉터리나 그 하위 디렉터리로만 쿠키가 전송됩니다.




HTTP 요청시 쿠키를 특정 URL로만 전송하도록 하는 방법
JSP 및 Servlet에서 쿠키의 path속성은 javax.servlet.http.CookiesetPath(String url) 메서드를 통해 설정할 수 있고 String getPath() 메서드를 통해 path값을 얻어올 수 있습니다.
setPath() 메서드를 사용할때에는 서버주소를 제외한 나머지 주소를 입력합니다. 예를 들어 localhost:8080/subDir1/ 을 쿠키 전송 범위로 설정하고 싶은 경우에는 다음과 같이 사용합니다.
<%
     Cookie cookie = new Cookie("name", "dololak");
     cookie.setPath("/subDir1/");
     response.addCookie(cookie);
     //String path = cookie.getPath(); -> /subDir1/
%>





쿠키 path 설정에 따른 전송 범위 테스트 실습 예제
쿠키를 여러개 생성해 path 속성값을 각각 설정해보고 여러 경로를 호출해 보았을때 어떤식으로 동작하는지 테스트해보도록 하겠습니다. 이번 예제에서는 다음 다섯개의 쿠키를 생성하여 테스트 할 것입니다. 쿠키 값은 중요하지 않으며, 쿠키의 name과 path만 알아두고 테스트해보시면 됩니다.

쿠키 name
path
전송범위
cookie1
지정하지 않음
쿠키를 생성했던 URL 범위에서 전송
cookie2
/
웹어플리케이션의 모든 URL 범위에서 전송
cookie3
/subDir1/
/subDir1/xx~~ 요청시 전송
cookie4
/subDir2/
/subDir2/xx~~ 또는 그 하위 경로인
/subDir2/subDir3/xx~~ 요청시 전송
cookie5
/subDir2/subDir3/
/subDir2/subDir3/xx~~ 요청시 전송


웹어플리케이션은 다음과 같이 구성합니다. setCookie.jsp는 위 5개의 쿠키를 생성하는 페이지입니다. getCookie.jsp는 현재 서버로 전송된 쿠키목록을 모두 출력하는 페이지이며, 각 디렉터리 경로별로 복사합니다.



setCookie.jsp
<%@ page contentType = "text/html; charset=utf-8" %>                                         
 
 
<html> 
<head> 
</head> 
<body> 
<%
     Cookie cookie1 = new Cookie("cookie1""cookie1"); 
 
     Cookie cookie2 = new Cookie("cookie2""cookie2"); 
     cookie2.setPath("/"); 
 
     Cookie cookie3 = new Cookie("cookie3""cookie3"); 
     cookie3.setPath("/subDir1/"); 
 
     Cookie cookie4 = new Cookie("cookie4""cookie4"); 
     cookie4.setPath("/subDir2/"); 
 
     Cookie cookie5 = new Cookie("cookie5""cookie5"); 
     cookie5.setPath("/subDir2/subDir3/"); 
 
     response.addCookie(cookie1);
     response.addCookie(cookie2);
     response.addCookie(cookie3);
     response.addCookie(cookie4);
     response.addCookie(cookie5);
%>
 
<h1>쿠키 저장 성공!</h1> 
</body> 
</html> 
cs


getCookie.jsp
<%@ page contentType = "text/html; charset=utf-8" %>                                         
 
 
<html> 
<head> 
</head> 
<body> 
<h1>subDir1</h1> 
    
<%
     Cookie[] cookies = request.getCookies();
     for(Cookie cookie : cookies){ 
           out.println("<h1>전송된 쿠키 : " + cookie.getName() + "</h1>"); 
     }
 %> 
</body> 
</html> 
cs



가장 먼저 /subDir1/setCookie.jsp를 실행합니다.



다섯개의 쿠키가 생성되었고, HTTP 응답 메시지를 보면 헤더에 다섯개의 쿠키가 생성된 것을 볼 수 있습니다.
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: cookie1=cookie1
Set-Cookie: cookie2=cookie2; Path=/
Set-Cookie: cookie3=cookie3; Path=/subDir1/
Set-Cookie: cookie4=cookie4; Path=/subDir2/
Set-Cookie: cookie5=cookie5; Path=/subDir2/subDir3/
Content-Type: text/html;charset=utf-8
Content-Length: 89
Date: Wed, 19 Sep 2018 11:33:40 GMT




이후 브라우저를 종료하지 않고 그대로 주소창에 /subDir1/getCookie.jsp를 요청합니다. 쿠키는 브라우저 단위로 저장하기 때문에 새로운 브라우저를 띄워 호출하면 아무런 쿠키도 출력되지 않습니다. subDir1 범위에서는 cookie1, cookie2, cookie3이 전송되었습니다.
cookie1은 path를 지정하지 않은 쿠키인데 자신이 생성되었던 경로였기에 전송되었으며, cookie2는 모든 경로범위를 가지는 쿠키입니다. cookie3은 /subDir1/로 지정된 쿠키이기 때문에 해당 경로에 포함되어 전송됩니다.






곧바로 이어서 /subDir2/getCookie.jsp를 호출합니다. cookie2와 cookie4가 전송된것을 볼 수 있습니다. cookie4는 /subDir2/로 지정된 쿠키이므로 현재 요청 범위에 포함됩니다.




곧바로 이어서 /subDir2/subDir3/getCookie.jsp를 호출합니다. cookie2, cookie4, cookie5가 호출되었습니다. /subDir2/subDir3/는 /subDir2/의 하위 디렉터리이므로 cookie4 또한 전송되었습니다.




블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,