상태정보 유지기술
쿠키(Cookie)
- 사용자의 컴퓨터에 클라이언트(사용자) 정보를 저장
- 서버의 부하가 분산
- 보안상의 문제가 발생할 수 있다.
- 정보저장 유효기간을 사용자가 설정한다.
- 한 사이트에서 저장할 수 있는 쿠키 객체는 20개로 한정되어 있음.
- 하나의 쿠키에 저장할 수 있는 데이터는 브라우져별 한계가 있음(4k)
- 컴퓨터에 쿠키 한계치(300개)가 오게 되면 랜덤하게 저장된 쿠키가 삭제됨.
- 쿠키에 저장된 데이터 타입은 문자열만 가능.
- 쿠키는 웹서버가 만든다.
동작방식
- 쿠키를 웹서버가 생성
- 클라이언트의 쿠키저장소에 쿠키저장
- 쿠키를 웹서버에 전송
쿠키생성
<%
Cookie cookie = new Cookie("cName", "cValue");
response.addCookie(cookie);
%>
쿠키객체 얻어오기
Cookie[] cookies = request.getCookies();
Cookie 객체 중요 API
메서드 |
리턴타입 |
설명 |
getName() |
String |
쿠키의 이름을 추출 |
getValue() |
String |
쿠키의 값을 추출 |
쿠키생성 예제
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="set.jsp" method="post">
쿠키이름 : <input type="text" name="cName"> <br>
쿠키 값 : <input type="text" name="cValue"><br>
<input type="submit" value="쿠키설정">
</form>
</body>
</html>
2. set.jsp 생성
- 인코딩 후, cName, cValue getParameter()로 받아오기
- 쿠키생성
- 쿠키전송
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String cName = request.getParameter("cName");
String cValue = request.getParameter("cValue");
//쿠키생성
Cookie cookie = new Cookie(cName, cValue);
//쿠키전송
response.addCookie(cookie);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>쿠키설정 완료</h2>
<a href="get.jsp">설정된 쿠키조회</a>
</body>
</html>
3. get.jsp생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookie[] cookies = request.getCookies();
StringBuilder sb = new StringBuilder();
for(Cookie c : cookies) {
String cName = c.getName();
String cValue = c.getValue();
sb.append("쿠키이름 : " + cName + ", ");
sb.append("쿠키값 : " + cValue + "<br>");
// request영역에 올리기도 가능
//pageContext.setAttribute("cookieData", sb.toString());
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>설정된 쿠키정보</h2>
<%= sb.toString() %>
<%-- ${ cookieData } --%>
<a href="makeForm.jsp">쿠키설정 이동</a>
</body>
</html>
쿠키의 구성
번호 |
명칭 |
설명 |
1 |
이름(name) |
각각의 쿠키를 구별하는데 사용. |
2 |
값(value) |
쿠키의 이름과 관련된 값 |
3 |
유효시간(maxAge) |
쿠키의 유지시간 |
4 |
도메인(domain) |
쿠키를 전송할 도메인 |
5 |
경로(path) |
쿠키를 전송할 경로 |
1.쿠키이름제약
- 아스키코드의 알파벳과 숫자만을 포함할 수 있다.
- 콤마(,) 세미콜론(;) 공백(‘ ‘) 등의 문자 포함 불가
- ’$’로 시작할 수 있다.
2. 쿠키값 : 인코딩과 디코딩
- 쿠키의 인코딩과 디코딩으로 한글과 같은 값 처리한다.
- 인코딩 : 쿠키의 이름이 한글일때 그냥 넣을 수 없으므로, 인코딩을 해줘야함.
- 인코딩 후 쿠키이름 : %EC%95%84%EC%95%84%EC%95%84, 쿠키값 : %EC%9D%B4%EC%9D%B4%EC%9D%B4 으로 출력되므로 우리가 이해할 수 있게 디코딩 필요
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String cName = request.getParameter("cName");
String cValue = request.getParameter("cValue");
// encoding ( 쿠키값이 한글일 때 그냥 넣을 수 없음! )
cName = URLEncoder.encode(cName,"utf-8");
cValue = URLEncoder.encode(cValue,"utf-8");
//쿠키이름 : %EC%95%84%EC%95%84%EC%95%84, 쿠키값 : %EC%9D%B4%EC%9D%B4%EC%9D%B4 으로 출력되므로 디코딩 필요
//쿠키생성
Cookie cookie = new Cookie(cName, cValue);
//쿠키전송
response.addCookie(cookie);
%>
- 디코딩 : get.jsp파일에서 수행
- 디코딩을 해주어야 우리가 이해할 수 있는 한글형식이 됨.
- 쿠키이름 : 아아아, 쿠키값 : 이이이
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookie[] cookies = request.getCookies();
StringBuilder sb = new StringBuilder();
for(Cookie c : cookies) {
String cName = c.getName();
String cValue = c.getValue();
// decoding 을 해줘야 우리가 이해할 수 있게 출력됨
cName = URLDecoder.decode(cName, "utf-8");
cValue = URLDecoder.decode(cValue, "utf-8");
sb.append("쿠키이름 : " + cName + ", ");
sb.append("쿠키값 : " + cValue + "<br>");
// request영역에 올리기도 가능
//pageContext.setAttribute("cookieData", sb.toString());
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>설정된 쿠키정보</h2>
<%= sb.toString() %>
<%-- ${ cookieData } --%>
<a href="makeForm.jsp">쿠키설정 이동</a>
</body>
</html>
3. 쿠키 유효시간
- Cookie.setmaxAge(int maxAge) : 초단위 설정
- 유효기간 미 지정시, 웹브라우저 닫을 때 쿠키도 함께 삭제
//유효시간 설정.
if(cAge!= null && cAge.length() !=0 ){
cookie.setMaxAge(Integer.parseInt(cAge) * 60);
}
- 쿠키를 쓰면 보안이 취약.
- 브라우저를 꺼도, 컴퓨터를 껐다켜도 남아있음.
세션(Session)
- 정보저장 위치 : 서버
- 서버의 부하가 가중된다.
- 보안상의 문제 발생 소지를 줄인다.
- 정보저장 최대 유효기간이 브라우저가 닫힐 때 까지 이다.
- 정보 저장시 객체타입이 가능하다.
- 클라이언트마다 세션생성
- 웹 컨테이너에서 클라이언트의 정보를 보관할 때 사용
- 별도의 속성을 사용하지 않은 경우 기본설정은 true (page session = “true”)
<%@ page session = "true" %>
<%
...
session.setAttribute("userInfo", userInfo);
%>
- Servlet에선 내장객체가 없어서 세션 객체를 얻어와야함. new로 만드는 경우는 없음
종료와 타임아웃
- 세션 타임아웃 시간설정
- web.xml에 설정(분 단위)
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
- 프로그램에서 설정(API활용 : 초단위)
- session.setMaxInactiveInterval(int interval);
Servlet에서 세션객체 얻기
// 세션이 없을 경우 새롭게 생성, 존재한다면 존재하는 객체 반환
HttpSession session = request.getSession();
HttpSession session = request.getSession(true);
// 세션이 없을 경우 null, 존재한다면 존재하는 객체 반환
HttpSession session = request.getSession(false);
세션 값 설정, 추출
- 설정 : session.setAttribute(“”);
- 추출 : session.getAttribute(“”);
- 삭제 :
- session.removeAttribute(“”);
- session.invalidate(); : 세션의 모든 객체 삭제