JSP(Cookie)
- 쿠키는 저장되어 있으면 요청할때 마다 전송하려고 하는 성격을 가지고 있다.
-> 동일한 도메인, 동일한 패스일경우에만 전송하도록 제한 할 수 있다.
쿠키의 구성
항목 | 설명 |
이름 | 각각의 쿠키를 구별하는데 사용되는 이름 |
값 | 쿠키의 이름과 관련된 값 |
유효시간 | 쿠키의 유지 시간 |
도메인 | 쿠키를 전송할 도메인 |
경로 | 쿠키를 전송할 요청 경로 |
- 쿠키의 네임 규약
1. 쿠키의 이름은 아스키 코드의 알파벳과 숫자만을 포함할 수 있다.
2. 콤마(,), 세미콜론(;), 공백(' ') 등의 문자는 포함할 수 없다.
3. $로 시작할 수 없다.
쿠키 관련 설명
- 쿠키 생성 : 클라이언트(브라우저 : 자바 스크립트)
서버(자바 : 응답객체의 응답 헤더에 저장 후 클라이언트에 전송됨)
- 쿠키 저장소 : 클라이언트(브라우저)
- 브라우저 별 상이한 저장소 형태 - 해당 브라우저의 메모리 활용
해당 브라우저가 인스톨된 폴더 내
- 쿠키 사이즈 : 4KB 이내로 생성
- 쿠키 성향 : 클라이언트(브라우저의 쿠키 저장소)에 저장된 쿠키는 해당 클라이언트 브라우저의 서버 대상 요청시
마다 요청 헤더에 포함되어 전송되려는 성향이 존재
* 전송 제한 : 쿠키 생성 시 패스, 도메인 속성을 활용
- 쿠키 생성 패턴 : 키=값;유효시간 =값;패스=값;도메인=값;
- 쿠키 패스 속성 : default / (컨텍스트 루트 : 루트)
- 쿠키 도메인 속성 : default 해당 쿠키 생성시 요청 도메인
- 쿠키 유효시간(만료시간) : 해당 쿠키 생성시 선언된 쿠키의 삭제까지 남은 시간
default -1(해당 쿠키가 저장된 브라우저의 종료시까지 종속)
- 쿠키는 보안에 취약함
아래와 같이 아이디나 비밀번호같이 프라이빗한 정보들은 쿠키에 저장하면 안되고 노출되어도
괜찮은 정보들을 저장해야함
쿠키 생성
<%
Cookie memidCookie = new Cookie("mem_id", "a001");
memidCookie.setPath("/");
response.addCookie(memidCookie);
Cookie mempwdCookie = new Cookie("mem_pass","asdfasdf");
//초단위 설정
mempwdCookie.setMaxAge(60*60*24);
// http://localhost/ddit/07/makeCookie.jsp - 브라우저 저장소에 저장된 쿠키가 전송되어짐
// http://localhost/ddit/06/makeCookie.jsp - 브라우저 저장소에 저장된 쿠키가 전송 x
mempwdCookie.setPath("/ddit/07/");
response.addCookie(mempwdCookie);
// 쿠키저장소에 저장된 인코딩 타입 : ISO-8859-1(라틴어)
// UTF-8(김은대) => 쿠키 저장소에 전송 -> ISO-8859-1(UTF-8(김은대)) - > 쿠키 저장소로부터 취득 -> UTF-8(김은대) -> UTF-8로 디코딩 후 활용
Cookie memnameCookie = new Cookie("mem_name", URLEncoder.encode("김은대", "UTF-8"));
//특정 도메인으로 전송할때만 쿠기정보가 전송되도록 설정
memnameCookie.setDomain("www.bagrant.co.kr");
memnameCookie.setPath("/ddit/07");
memnameCookie.setMaxAge(60*60);
response.addCookie(memnameCookie);
// == > "mem_name" = UTF-8(김은대);유효시간=60*60;도메인=www.bagrant.co.kr;path=/ddit/07
%>
* localhost -> www.bagrant.co.kr로 로 바꾸는법
쿠키 보기
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 클라이언트(브라우저)의 쿠키 저장소에 저장된 쿠키는 쿠키 생성시, 패스, 도메인 속성을 기초로 해당 클라이언트의 서버 대상 요청시
// 동반 전송(요청 패킷의 요청 헤더 )
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
out.println("key :" + cookie.getName()); // getName이 cookie의 key값
out.println("key :" + URLDecoder.decode(cookie.getValue(), "UTF-8") + "<br/>"); // getValue가 cookie의 Value값
}
%>
쿠키 수정
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookie[] cookies = request.getCookies();
for(Cookie currentCookie : cookies){
if("mem_id".intern() == currentCookie.getName().intern()){
Cookie memidCookie = new Cookie("mem_id","b00");
memidCookie.setPath("/");
response.addCookie(memidCookie);
}
}
// makeCookie.jsp -> viewCookie.jsp -> modifyCookie.jsp
// viewCookie.jsp
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
쿠키가 잘 수정 되었습니다.
</body>
</html>
쿠키 삭제
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookie[] cookies = request.getCookies();
for(Cookie currentCookie : cookies){
if("mem_id".intern() == currentCookie.getName().intern()){
Cookie memidCookie = new Cookie("mem_id","a001");
memidCookie.setPath("/");
memidCookie.setMaxAge(0);
//해당 쿠키의 유효시간(만료시간)을 0으로 설정 후
// 응답객체의 응답헤더에 저장 및 클라이언트의 쿠키 저장소에
// 저장처리로 해당 쿠키를 즉시 삭제
response.addCookie(memidCookie);
}
// makeCookie.jsp -> viewCookie.jsp -> deleteCookie.jsp -> viewCookie.jsp
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
쿠키가 바사삭 조각이 나버렸습니다.
</body>
</html>
쿠키 set, get, delete js파일
function Get_Cookie( check_name ) {
var a_all_cookies = document.cookie.split( ';' );
var a_temp_cookie = '';
var cookie_name = ''; // 쿠키 이름
var cookie_value = ''; // 쿠키 값
var b_cookie_found = false;
for (var i = 0; i < a_all_cookies.length; i++ ){ // 모든 쿠키 가져 와서 loop
a_temp_cookie = a_all_cookies[i].split( '=' ); // 쿠키 이름과 값을 나눔
cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, ''); // [=] 기호 앞의 값을 쿠키
if ( cookie_name == check_name ){// 이름으로
b_cookie_found = true;
if ( a_temp_cookie.length > 1 ){
// [=] 기호 뒤의 값을 쿠키값으로
cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') );
}
return cookie_value; // cookie 값 리턴
break;
}
a_temp_cookie = null; // temp 쿠키를 비워줌
cookie_name = ''; // 쿠키 이름을 비워줌
}
if ( !b_cookie_found ) {
return null;
}
}
function Set_Cookie( name, value, expires, path, domain, secure ) {
var today = new Date();
today.setTime( today.getTime());
if ( expires ){
expires = expires * 1000 * 60 * 60 * 24;
}
var expires_date = new Date( today.getTime() + (expires) );
document.cookie = name + "=" +escape( value ) +
( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
( ( path ) ? ";path=" + path : "" ) +
( ( domain ) ? ";domain=" + domain : "" ) +
( ( secure ) ? ";secure" : "" );
}
function Delete_Cookie( name, path, domain ) {
if ( Get_Cookie( name ) ) document.cookie = name + "=" +
( ( path ) ? ";path=" + path : "") +
( ( domain ) ? ";domain=" + domain : "" ) +
";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}
document.cookie 쿠키저장소에 접근할 수 있는 출입구
escape : unicode로 인코딩해서 값을 가져오는 거