-
[Camel][JSP] 쿠키 (Cookie) in JSPJSP 2020. 3. 12. 21:11
1. 쿠키(Cookie)란?
쿠키는 웹브라우저가 보관하고 있는 데이터입니다. 웹브라우저는 웹 서버에 요청을 보낼 때 쿠키를 함께 전송합니다. 웹 서버는 전달 받은 쿠키를 통해 필요한 데이터를 읽어오는 것입니다. 이 쿠키는 웹 브라우저에서 생성하며, 웹 서버에서도 생성할 수 있습니다. 웹 어플리케이션을 사용하는 동안 지속적으로 유지해야하는 정보는 쿠키를 사용해서 저장됩니다.
2. 쿠키의 동작방식
- 쿠키 생성 단계 : 쿠키는 주로 웹 서버에서 생성되며, 생성된 쿠키는 응답 데이터에 함께 저장되어 웹 브라우저로 전달됩니다.
- 쿠키 저장 단계 : 응답 데이터와 함께 쿠키를 전달받은 웹 브라우저는 쿠키 저장소에 쿠키를 저장합니다. 이때 쿠키는 종류에 따라 메모리나 파일로 저장됩니다.
- 쿠키 전송 단계 : 웹 브라우저는 한번 저장된 쿠키를 요청이 생길 때마다 웹 서버에 전달합니다.
3. 쿠키의 구성
- 이름 : 쿠키를 구별하기 위해 사용되는 이름.
- 값 : 쿠키의 이름과 관련된 값
- 유효 시간 : 쿠키의 유지시간
- 도메인 : 쿠키를 전송할 도메인
- 경로 : 쿠키를 전송할 요청 경로
하나의 웹 브라우저는 여러개의 쿠키를 가질 수 있습니다. 쿠키의 이름에는 아스키 코드의 알파벳과 숫자만 포함되며, 콤마(,), 세미콜론(;), 공백( )은 포함될 수 없습니다. 또한, $로 시작할 수도 없습니다.
만약 알파벳과 숫자가 아닌 문자나 공백, 괄호, 등호 기호, 콤마, 콜론, 세미콜론 등의 문자를 포함하기 위해서는 BASE64 인코딩으로 처리해 주어야합니다.
4. 쿠키의 생성
JSP에서 쿠키를 생성하기 위해서는 Cookie라는 클래스를 사용하면 됩니다. Cookie 클래스의 사용방법은 아래와 같습니다.
<% Cookie ck = new Cookie("cookieName","cookieValue"); response.addCookie(ck); %>
examples.jsp
<%@ page contentType="text/html; charset=utf-8" %> <%@ page import="java.net.URLEncoder" %> <% Cookie ck = new Cookie("name", URLEncoder.encode("낙타", "utf-8")); response.addCookie(ck); %> <html> <head><title> Cookie 생성 </title></head> <body> Cookie Name : <%= ck.getName() %> <br> <%= ck.getName() %> Cookie Value : <%= ck.getValue() %> </body> </html>
위의 예제 코드를 확인하면 Cookie 객체를 생성한 후 Cookie 클래스의 메소드를 이용해서 쿠키의 정보를 읽어오는 것을 확인 할 수 있습니다. 이처럼 Cookie 클래스의 메소드를 이용하면 쿠키의 정보를 읽어오거나 변경할 수 있습니다. Cookie 클래스의 사용가능한 메소드는 아래와 같습니다.
Cookie 클래스의 메소드
Type and Method Description String getName( ) 쿠키의 이름을 반환한다. String getValue( ) 쿠키의 값을 반환한다. String getDomain( ) 쿠키의 도메인을 반환한다. String getPath( ) 쿠키의 경로를 반환한다. int getMaxAge( ) 쿠키의 유효시간을 반환한다. void setValue( String value ) 쿠키의 값을 지정한다. void setDomain( String domain ) 쿠키가 전송될 서버의 도메인을 지정한다. void setPath( String uri ) 쿠키의 전송 경로를 지정한다. void setMaxAge( int sec ) 쿠키의 유효시간을 초(sec) 단위로 지정한다. 5. 쿠키의 활용
5-1. 쿠키 값 읽기
웹 브라우저는 요청 헤더에 쿠키를 저장해서 보내고, JSP 파일에서는 아래의 코드를 사용해서 쿠키의 값을 읽어올 수 있습니다.
Cookie[] cks = request.getCookies();
위의 getCookies 메소드의 반환형은 쿠키의 배열입니다. 반환할 것이 없는 경우 null을 반환하게됩니다. 그렇기 때문에 아래의 코드의 if문을 통해 null 여부를 확인하면 NullPointerException 을 방지할 수 있습니다.
쿠키의 값을 읽는 코드
<%@ page contentType="text/html; charset=utf-8" %> <%@ page import="java.net.URLDecoder" %> <html> <head> Cookie 목록 </head> <body> Cookie 목록 <br> <% Cookie[] cks = request.getCookies(); if( cks != null && cks.length > 0 ) { for( int i =0; i < cks.length; i++ ){ %> <%= cks[i].getName() %> = <%= URLDecoder.decode(cks[i].getValue(), "utf-8") %> <br> <% } } else { %> No Cookie <% } %> </body> </html>
5-2. 쿠키 값 변경 및 삭제
쿠키의 값을 변경하는 방법으로는 같은 이름의 새로운 쿠키를 생성한 뒤 응답 데이터로 전달하는 방식을 사용합니다.
그리고 쿠키의 값을 삭제할 때도 역시 동일하게 같은 이름의 새로운 쿠키를 생성하고 응답 데이터로 전달하는 방식을 사용하지만, 전달하기전에 추가적으로 setMaxAge 메소드의 파라미터로 0을 전달함으로써 유효시간을 0초로 만들어 응답 헤더에 추가해 주게됩니다.
쿠키 값 변경 예제 코드
<%@ page contentType="text/html; charset=utf-8" %> <%@ page import="java.net.URLEncoder" %> <% Cookie[] cks = request.getCookies(); if( cks != null && cks.length > 0 ) { for( int i =0; i < cks.length; i++ ){ if(cks[i].getName().equals("name")) { Cookie ck = new Cookie("name", URLEncoder.encode("돼지","utf-8")); response.addCookie(ck); } } } %> <html> <head> Cookie 값 변경 </head> <body> Cookie 값 변경 <br> </body> </html>
쿠키 값 삭제 예제 코드
<%@ page contentType="text/html; charset=utf-8" %> <%@ page import="java.net.URLEncoder" %> <% Cookie[] cks = request.getCookies(); if( cks != null && cks.length > 0 ) { for( int i =0; i < cks.length; i++ ){ if(cks[i].getName().equals("name")) { Cookie ck = new Cookie("name", ""); ck.setMaxAge(0); response.addCookie(ck); } } } %> <html> <head> Cookie 값 삭제 </head> <body> Cookie 값 삭제 <br> </body> </html>
6. 쿠키의 도메인
쿠키는 쿠키를 생성한 서버에만 전송됩니다. 즉, 한 서버에 연결해서 생성된 쿠키는 다른 서버로 연결할 때에는 전송되지 않는 다는 것입니다. 하지만 종종 같은 도메인을 사용하는 서버에 모두 쿠키를 보내고 싶은 상황이 있을 수 있습니다. 이런 상황에서 쓰이는 메소드가 setDomain 메소드입니다.
setDomain 메소드는 생성된 쿠키가 전송될 수 있는 도메인을 지정하는 메소드인데, 지정할 수 있는 값은 두 가지 형태가 가능합니다.
- .example.com - "." 으로 시작하는 경우 관련 도메인에 모두 쿠키를 전송한다.
- www.example.com - 특정 도메인에만 쿠키를 전송한다.
첫 번째의 경우의 예로는 ".example.com", "www.example.com", "m.example.com"에 모두 쿠키를 전송할 수 있습니다. 하지만 두 번째의 경우에는 오직 "www.example.com"에만 쿠키를 전송합니다.
쿠키의 도메인을 지정할 때 주의할 점으로는 setDomain 메소드의 인자로 현재 서버의 도메인 및 상위 도메인만 전달 할 수 있다는 것입니다. 만약 현재 JSP 페이지가 실행되는 서버의 주소가 m.example.com 이라면, setDomain 메소드의 인자로 지정할 수 있는 것은 .example.com 이나 m.example.com인 것입니다. 다른 도메인이 인자로 주어질 경우 쿠키가 생성되지 않습니다.
웹 서버에서 다른 도메인이 인자로 주어질 때 쿠키를 생성하지 않는 이유는 보안상 문제 때문입니다. 임의의 다른 서버에서 쿠키의 값을 마음대로 변경할 경우 보안상 위험이 커지게 됩니다.
7. 쿠키의 경로
Cookie 클래스의 setPath 메소드를 사용하면 우리는 쿠키의 경로를 지정할 수 있습니다. 경로란 URL에서 도메인 이후의 부분을 의미하며, 예를 들어 URL이 "http://localhost:8080/ch2/cookie/path/CookiePath.jsp"라면 경로는 "/ch2/cookie/path/CookiePath.jsp"인 것입니다. 쿠키에서의 경로는 디렉터리 수준의 경로를 사용하며, 앞선 예시의 쿠키에서 사용할 수 있는 경로는 "/ch2", "/ch2/cookie", "/ch2/cookie/path/" 등이 있습니다.
setPath 메소드를 사용해 쿠키의 경로를 지정하면, 쿠키는 지정한 경로와 하위 경로에 대해서 쿠키를 전송할 수 있습니다. 경로를 지정하지 않은 쿠키의 경우에는 실행한 JSP 페이지의 경로를 경로로 사용합니다.
일반적으로 쿠키는 웹 어플리케이션에 포함된 여러개의 JSP와 서블릿에서 공통으로 사용되는 경우가 많기 때문에 대부분의 경우 쿠키의 경로는 "/"을 지정합니다.
쿠키 경로 확인 에제 코드
<%@ page contentType="text/html; charset=utf-8" %> <%@ page import="java.net.URLEncoder" %> <% Cookie ck1 = new Cookie("path1", URLEncoder.encode("Path:/ch2/cookie/path1", "utf-8")); ck1.setPath("/ch2/cookie.path1"); response.addCookie(ck1); Cookie ck2 = new Cookie("path1", URLEncoder.encode("Path:/", "utf-8")); ck2.setPath("/"); response.addCookie(ck2); Cookie ck3 = new Cookie("path1", URLEncoder.encode("Path:", "utf-8")); response.addCookie(ck3); %> <html> <head><title> Cookie 경로 지정 </title></head> <body> Cookie Path : [<%= ck1.getPath() %>] <br> <%= ck1.getName() %> Cookie Value : <%= ck1.getValue() %> <br> Cookie Path : [<%= ck2.getPath() %> <br>] <%= ck2.getName() %> Cookie Value : <%= ck2.getValue() %> <br> Cookie Path : [<%= ck3.getPath() %> <br>] <%= ck3.getName() %> Cookie Value : <%= ck3.getValue() %> <br> </body> </html>
8. 쿠키의 유효시간
쿠키는 유효 시간이라는 것을 가지고 있습니다. 이때 쿠키의 유효시간을 지정해 주지않으면 웹 브라우저를 종료할 때 쿠키는 자동으로 삭제됩니다. 쿠키의 유효시간이란 말 그대로 정해진 시간동안 쿠키가 삭제되지 않고 존재하는 시간을 말합니다. 그렇기 때문에 웹 브라우저를 종료하더라도 쿠키의 유효시간이 지나지 않았다면 쿠키는 삭제되지 않습니다.
쿠키의 유효시간은 setMaxAge 메소드를 사용해 지정할 수 있으며, 전달되는 인자는 초(sec) 단위입니다. 우리가 일상에서 쉽게 접할 수 있는 로그인 아이디 저장과 같은 기능이 바로 이 쿠키의 유효시간을 활용한 예시입니다.
<%@ page contentType="text/html; charset=utf-8" %> <%@ page import="java.net.URLEncoder" %> <% Cookie ck = new Cookie("name", URLEncoder.encode("낙타", "utf-8")); ck.setMaxAge(60); response.addCookie(ck); %> <html> <head><title> Cookie 유효시간 지정 </title></head> <body> 쿠키 유효시간을 60초로 지정 </body> </html>
'JSP' 카테고리의 다른 글
[Camel][JSP] Session (세션) (0) 2020.03.13 [Camel][JSP] CookieBox 클래스 & 로그인 페이지 (0) 2020.03.13 [Camel][JSP] 에러(Error) 처리, 에러 페이지 (Error Page) (0) 2020.03.12 [Camel][JSP] 요청 흐름 제어 ( <jsp:forward> ) (0) 2020.03.11 [Camel][JSP] 페이지 모듈화 ( <jsp:include> ) (1) 2020.03.11