JAVA/JSP
JSP | Cookie
pathas
2020. 2. 22. 22:12
Cookie
HTTP 프로토콜에서 상태를 유지하기 위한 방법 중 하나
쿠키 파일에 사용자 정보를 저장해서 상태를 유지하는 방법
HTTP
HTTP(Hypertext Transfer Protocol)
웹 서버와 웹 브라우저 간 하이퍼텍스트 문서 전송을 위해 사용하는 프로토콜
- 상태가 없음(stateless) 즉, 웹 브라우저의 요청에 대한 응답을 하고 나면
해당 클라이언트와의 연결을 지속하지 않음 - 이전에 무엇을 했고 지금 무엇을 하는지에 대한 정보를 갖고 있지 않음
- 연결이 지속되지 않기 때문에 클라이언트를 구분할 수 없음
※ 연결을 유지하는(stateful) 프로토콜: FTP, Telnet
HTTP에서 상태를 유지하기 위한 방법
- URL Rewriting: GET형식에서만 사용 가능
다른 페이지로 이동할 때 URL의 뒷 부분 정보(URI)를 가지고 다니는 방법
정보의 양이 제한되어 있으며 보안에 문제가 있음 - Hidden Form Field: POST 방식으로 처리하기 위한 방법
HTML의 < form > 태그와 < input > 태그의 숨겨진 텍스트 필드 이용
텍스트 필드를 이용해서 값을 계속 가지고 다녀야 하는 번거로움이 있음 - Cookie: 웹 사이트에 접속할 때 생성되는 정보를 파일에 저장해서 관리하는 방법
- Session: 클라이언트에 세션 ID를 부여해서 클라이언트를 구분하는 방법
Cookie 개요
웹 사이트에 접속할 때 생성되는 정보를 저장한 임시 파일
- 사용자 정보 유지 및 접속 편의성을 목적으로 함
- 웹 브라우저의 정보를 웹 브라우저에 저장
클라이언트의 하드디스크에 저장됨(C:/~/사용자/Cookies) - 이후에 서버로 전송되는 요청에는 쿠키가 가지고 있는 정보가 같이 포함되어서 전송
- 웹 서버는 웹 브라우저의 요청에 포함되어 있는 쿠키를 읽어서
새로운 웹 브라우저인지 이전에 요청을 했던 브라우저인지 판단 - 일반적으로 4KB 이하의 크기로 생성
- 생성된 쿠키를 HTTP Header에 포함시켜 Response로 전송
Cookie 단점
- 웹 브라우저가 방문했던 웹 사이트에 대한 정보 및 개인 정보가 기록되기 때문에
개인의 사생활 및 정보를 침해할 소지가 있다는 치명적인 단점이 있음
→ 웹 브라우저에 쿠키 거부 기능이 추가됨 - 쿠키 거부가 설정되어 있으면 웹 브라우저와의 연결을 지속할 수 없음
→ 이러한 문제점 때문에 최근에는 Session(세션)을 많이 사용함
JSP에서 Cookie 사용
Cookie 생성
javax.servlet.http 패키지에 있는 Cookie 클래스 객체를 생성
JSP 파일이 서블릿으로 변환될 때 자동 import 되기 때문에 따로
import문을 작성하지 않아도 됨
Cookie cookie = new Cookie(String name, String value);
- cookie 이름은 알파벳과 숫자로만 구성
- name 매개 변수로 쿠키 이름 지정
- value 매개 변수로 쿠키에 해당하는 값 설정
- value 값으로 한글 지정 가능
따로 인코딩할 필요 없음
Cookie 수명 지정
cookie.setMaxAge(int expiry);
- 초 단위로 쿠키 유효 기간 설정
- 지정한 기간만큼만 쿠키가 유효함
시간 초과 시 사용기간이 만료되며 더 이상 사용되지 않음
Cookie 값 수정
cookie.setValue(String newValue);
- 처음에 쿠키 이름과 함께 지정했던 쿠키 값을 newValue로 변경
Cookie 전송
response.addCookie(Cookie cookie);
- 웹 클라이언트로 보내는 응답 정보를 갖고 있는
response 객체에 cookie 객체 추가
Cookie 읽기
Cookie[] cookies = request.getCookies();
- 요청 정보를 갖는 request 객체에서 쿠키를 읽어 들임
- getCookie() 메소드는 웹 브라우저에 저장된
모든 쿠키를 읽어 오기 때문에 리턴 타입을 Cookie[]로 지정
Cookie 이름 & 값 얻어오기
<!-- 이름 반환 -->
cookie.getName();
<!-- 값 반환 -->
cookie.getValue();
예제
쿠키를 만들고 불러와서 출력하는 예제
makeCookie.jsp
쿠키를 생성하는 JSP 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Make a Cookie</title>
</head>
<body>
<%
// 1. 쿠키생성 -> 이름, 저장할 값 지정
String cookieName = "myCookie";
Cookie cookie = new Cookie(cookieName, "apple");
// 2. 쿠키 기본값 설정
cookie.setMaxAge(60 * 2);
// 3. 쿠키 값 변경
cookie.setValue("Melon");
// 4. 쿠키 전송
response.addCookie(cookie);
%>
<h2>쿠키가 생성되었습니다.</h2>
<br /> 쿠키의 내용은
<a href="useCookie.jsp">여기서 확인 가능</a>
</body>
</html>
useCookie.jsp
쿠키를 읽어 들여서 출력하는 JSP 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Read Cookie</title>
</head>
<body>
<%
// 모든 쿠키를 읽어 와서 쿠키 배열에 저장
Cookie[] cookies = request.getCookies();
// 쿠키가 있는 경우 실행
if(cookies != null){
// 배열 형태로 저장했기 때문에 확장 for문 사용
for(Cookie cookie : cookies){
// cookie 이름이 myCookie 라면 아래와 같이 출력
if(cookie.getName().equals("myCookie")){ %>
cookieName: <%=cookie.getName()%> <br />
cookieValue: <%=cookie.getValue()%>
<% }
}
}
%>
</body>
</html>
결과
HTTP 프로토콜에서 클라이언트의 정보를 유지하는 방법 중 하나인 쿠키의 개요와 사용법에 대해 알아보았습니다.
쿠키는 웹 클라이언트에 특정 내용의 파일을 전송해서
이후부터 해당 파일의 내용으로 클라이언트를 구분하는 방식입니다.
사용자의 접속 정보 및 개인 정보가 파일로 저장되기 때문에 보안에 취약하다는 문제점이 있습니다.
이러한 문제로 최근에는 세션을 사용한다고 하지만 세션은 관리하기가 어렵기 때문에
여전히 쿠키를 사용하는 경우도 많다고 합니다.