이전글


도메인 설정으로 HTTP 요청시 여러 웹서버로 전송하도록 하는 방법
쿠키는 기본적으로 쿠키가 생성된 서버로만 전송됩니다. 예를 들어 google서버에서 생성된 쿠키는 google로 요청시에만 전송되는것입니다. 그러나 대규모 웹 서비스를 운영하는 경우에는 하나의 웹서버가 아닌 여러 웹서버가 하나의 시스템을 이루면서 운영되는 경우가 있습니다. 하나의 서비스 시스템이기에 여러 서버간에 쿠키 데이터를 공유하여 사용해야 할 필요성이 있습니다. 

예를 들어 tistory 라는 기업 시스템을 이루는 서버가 다음과 같이 구성될 수 있는데, 이 세 개의 서버간에 쿠키 데이터가 공유되어야 한다면 어떻게 할까요?
  • 인사관리 서버 - hr.tistory.com 
  • 웹메일 서버 - mail.tistory.com
  • 홈페이지 서버 -  www.tistory.com

또는 이러한 경우도 있을 수 있습니다. 웹서버는 하나일지라도 여러개의 주소를 사용하는 경우입니다. 다음은 저의 블로그 플랫폼인 티스토리의 웹사이트 주소입니다. 주소는 www.tistory.com 이군요.



저의 블로그 주소는 다음과 같이 dololak.tistory.com 입니다.



만약 티스토리의 웹서버에서 블로거들의 접속 동향을 파악하기 위해 쿠키를 두 개의 주소에서 모두 사용할 수 있게 하려면 어떻게 해야할까요? 두개의 주소는 공통점이 있습니다. tistory.com 이라는 도메인을 사용한다는 것이지요. 즉 두 개의 주소는 tistory.com 도메인의 하위 도메인인 것입니다. 쿠키는 하나의 도메인 범위 안의 여러 서버들간에 쿠키를 공유할 수 있도록 domain 속성을 제공하고 있습니다.



쿠키의 domain 속성
쿠키에는 이러한 점을 고려해 domain이라는 속성을 제공하고 있습니다. domain 속성은 현재 쿠키가 어떤 서버로 전송되어져야 하는지를 지정할 수 있는 속성입니다. 속성을 지정하지 않을경우에는 생성된 서버로만 전송되며, 지정할 수 있는 값으로는 현재 서버의 주소 혹은 상위 도메인까지만 지정할 수 있습니다.

즉 티스토리 서버에서 쿠키를 생성하는 경우 domain 속성에는 www.tistory.com  또는 tistory.com 까지만 지정할 수 있습니다. ww2.tistory.com이나 www.google.com 등 다른 서버의 주소를 도메인으로 설정하는것은 불가능합니다.

도메인과 관련된 메서드는 다음과 같이 사용할 수 있습니다. setDomain(String domain) 메서드는 도메인을 설정할 수 있으며, String getDomain() 메서드로 설정된 도메인을 구할 수 있습니다.
<%                                                                                    
     Cookie cookie = new Cookie("hrCookie""hrCookie"); 
     cookie.setDomain("hr.dololak.com"); 
 
 
     response.addCookie(cookie);
 %> 
cs



도메인 설정에 따른 쿠키 전송 테스트
setDomain()메서드를 통해 여러가지 설정의 쿠키를 만들어보고 HTTP 요청에 따라 쿠키가 어떻게 전송되는지 알아보도록 합니다.

그러나 로컬(127.0.0.1)에서 테스트시에 도메인이 없기 때문에 hosts 파일을 설정해 주어야 합니다. 원래대로라면 브라우저의 주소창에 도메인명(예를 들어 www.naver.com이나 네이버)을 입력하는 경우 DNS Resolve를 통해 DNS 서버에 IP를 질의해야 하지만 hosts 파일에 설정을 저장해 두면 해당 파일을 우선적으로 검사하여 도메인에 해당하는 IP가 있는 경우 해당 IP를 사용합니다.

C:\Windows\System32\drivers\etc\hosts 파일을 메모장등의 편집기로 실행합니다.



아래와 같이 설정하면 다음과 같은 세 도메인 주소를 브라우저로 접근할 시 모두 127.0.0.1로 요청하게 됩니다. 설정을 변경하기 위해서는 백신등의 실시간 검사가 꺼져 있어야 하며, 윈도우즈 관리자 계정인 Administrator 계정의 권한이 있어야 합니다. 보안과 직결되는 설정이기 때문에 권한이 필요하며, 백신이 감시하는 대상이기 때문입니다.





쿠키 생성 JSP 페이지
쿠키를 생성할 JSP 페이지 saveCookie.jsp를 다음과 같이 작성합니다. 앞으로 예제를 테스트할 때 쿠키 생성시 hr.dololak.com을 이용 할것이므로 주석은 hr.dololak.com을 기준으로 합니다.

상위 도메인을 설정하는 경우에는 tistory.com이 아닌 .tistory.com 으로 .을(점) 앞에 붙여주어야 예전 버전의 브라우저에서도 상위 도메인으로 인식하여 전송합니다.(최신 버전의 크롬의 경우 tistory.com으로만 지정해도 상위 도메인으로 인식하여 tistory.com 도메인을 가진 모든 주소로 전송함.)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
   
 <% 
     //도메인 입력 안한 경우 
     Cookie cookie1 = new Cookie("noDomain""noDomain"); 
     
     //현재 서버의 도메인 
     Cookie cookie2 = new Cookie("hrCookie""hrCookie"); 
     cookie2.setDomain("hr.dololak.com"); 
     
     //현재 주소의 상위 도메인인 dololak.com으로 지정한 경우 
     Cookie cookie3 = new Cookie("highCookie""highCookie"); 
     cookie3.setDomain(".dololak.com"); 
     
     //상위 도메인은 dololak.com 으로 같으나 호스트명은 www로 다르게 지정한 경우 
     Cookie cookie4 = new Cookie("wwwCookie""wwwCookie"); 
     cookie4.setDomain("www.dololak.com"); 
     
     //상위 도메인도 다른 완전히 다른 도메인 주소를 지정한 경우 
     Cookie cookie5 = new Cookie("otherCookie""otherCookie"); 
     cookie5.setDomain("www.google.com"); 
     
     response.addCookie(cookie1);
     response.addCookie(cookie2);
     response.addCookie(cookie3);
     response.addCookie(cookie4);
     response.addCookie(cookie5);
     
 %> 
<html> 
<head> 
</head> 
<body> 
     <h1>쿠키 생성 완료</h1> 
</body> 
</html>
cs




쿠키 확인 JSP 페이지 작성
다음은 브라우저가 전송한 쿠키 목록을 확인할 수 있는 JSP 페이지인 getCookie.jsp 를 작성합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
   
<html> 
<head> 
</head> 
<body> 
     <h1>모든 쿠키 목록 출력</h1> 
     
<%
     Cookie[] cookies = request.getCookies();
     for(Cookie cookie : cookies){ 
           out.println("<h1>전송된 쿠키 : " + cookie.getName() + "</h1>"); 
     }
 %> 
</body> 
</html> 
cs




쿠키 생성 및 전송 테스트
테스트를 위해 먼저 hr.dololak.com/saveCookie.jsp 을 요청합니다. 포트 번호는 자신의 톰캣 환경에 따라 입력합니다. 쿠키는 hr.dololak.com 서버에서 생성됩니다.



hr.dololak.com 서버에서 출력한 응답메시지를 보면 생성된 쿠키들이 다음과 같이 헤더에 담겨 브라우저로 출력되는것을 볼 수 있습니다.
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: noDomain=noDomain
Set-Cookie: hrCookie=hrCookie; Domain=hr.dololak.com
Set-Cookie: highCookie=highCookie; Domain=dololak.com
Set-Cookie: wwwCookie=wwwCookie; Domain=www.dololak.com
Set-Cookie: otherCookie=otherCookie; Domain=www.google.com
Content-Type: text/html;charset=UTF-8
Content-Length: 92
Date: Sat, 15 Sep 2018 07:32:29 GMT



쿠키를 생성했던 현재 서버 주소로 HTTP 요청한 경우
이번에는 생성된 쿠키가 전송되는것을 확인하기 위해 hr.dololak.com/getCookie.jsp로 요청합니다. 꼭 saveCookie.jsp를 요청했던 브라우저에서 그대로 주소창에 해당 URL을 입력해야 합니다. 쿠키가 브라우저 단위로 생성되기 때문에 새로운 브라우저를 실행하는 경우 쿠키 전송이 되지 않습니다.

쿠키를 생성했던 서버 주소인 hr.dololak.com으로 HTTP 요청한 경우입니다. 헤더의 맨 아래 Cookie 속성에 여러가지 쿠키를 전송하는것을 볼 수 있습니다.
GET /getCookie.jsp HTTP/1.1
Host: hr.dololak.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: JSESSIONID=3D4F7AD11580A9156D09298F12FD8972; noDomain=noDomain; hrCookie=hrCookie; highCookie=highCookie


쿠키 목록중에 JSESSIONID라는 쿠키가 있는데, 이는 톰캣에서 생성한 세션을 구분하기 위한 세션쿠키로 나중에 세션에 대한 포스팅에서 설명하도록 하겠습니다.

noDomain 쿠키 - 도메인을 지정해주지 않는 경우 기본적으로 생성된 서버로 쿠키가 전송됩니다.
hrCookie 쿠키 - 도메인을 hr.dololak.com을 지정했는데 현재 요청이 해당 서버로 전송되었기 때문에 쿠키또한 전송됩니다.
highCookie 쿠키 - 도메인을 dololak.com을 지정했기 때문에 하위 도메인인 hr.dololak.com은 쿠키가 전송됩니다.




상위 도메인은 같지만 호스트명이 다른 서버로 HTTP 요청한 경우
상위 도메인은 dololak.com으로 같지만 호스트명이 쿠키를 생성했던 hr.dololak.com이 아닌 www.dololak.com으로 HTTP 요청을 보낸 경우입니다. 헤더에 highCookie가 전송된 것을 볼 수 있는데, highCookie는 도메인을 dololak.com으로 설정했던 쿠키입니다. 그러나 www.dololak.com으로 지정했던 wwwCookie는 전송되지 않았는데, 이는 www.dololak.com은 엄연히 다른 서버의 주소이기 때문에 브라우저에서 저장하지 않았기 때문입니다.
GET /getCookie.jsp HTTP/1.1
Host: www.dololak.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: highCookie=highCookie






상위 도메인조차 다른 주소로 HTTP 요청한 경우
처음 생성했던 쿠키 중 도메인을 www.google.com으로 설정했던 쿠키의 경우 브라우저로 www.google.com에 접속한다 하여도 해당 쿠키가 전달되지 않습니다. 이는 보안과 관련된 정책으로 쿠키를 악의적으로 특정 서버로 전송할 수 있다면 위험하기 때문입니다. 사실 더 정확하게는 최초 쿠키가 생성되어 Set-Cookie 헤더로 쿠키값이 전달되었을 당시에 브라우저는 생성된 서버의 주소와 관련없는 도메인을 가진 쿠키는 저장조차 하지 않습니다.



쿠키는 자신이 어느 서버에서 생성되었는지 알고 있다
쿠키는 자신이 어느 서버에서 생성되었는지 어떻게 알고 있을까요? 최초 쿠키가 생성되었던 saveCookie.jsp페이지를 요청할때를 생각해보세요. 브라우저에서는 hr.dololak.com/saveCookie.jsp를 요청할 때 HTTP요청을 보냈고 그에대한 HTTP 응답 메시지에 쿠키가 담겨 왔습니다. 따라서 해당 응답메시지의 Set-Cookie 헤더로 넘겨받은 쿠키는 해당 서버에서 생성된것입니다. 브라우저는 이후에 HTTP 요청이 있을때마다 생성된 서버의 주소와 domain 속성을 참고하여 쿠키를 보내야할 서버인지를 판단합니다.

블로그 이미지

도로락

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

댓글을 달아 주세요! 질문 환영합니다!