JSP Servlet 쿠키, 세션 (Cookie, Session)
1. 쿠키와 세션의 필요성
- HTTP 특징
connectionless(비연결성) : 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어버리는 특징
stateless(무상태) : 통신이 끝나면 상태를 유지하지 않는 특징
쿠키와 세션을 사용해 사용자의 상태를 유지할 수 있음
2. 쿠키 (Cookie)
- 클라이언트(브라우저)에 저장되는 키와 값이 들어있는 작은 데이터 파일
- 쿠키 동작 방식
- 쿠키 사용 예시
① ID 저장, 로그인 상태 유지
② 일주일간 다시 보지 않기
③ 쇼핑몰 장바구니 기능 - 쿠키 단점
① 보안에 취약
② 작은 허용 용량
③ 브라우저를 변경할 경우 다른 브라우저에게 저장한 쿠키 값을 사용할 수 없음
3. 쿠키 생성, 전달, 확인, 제거하기
- 쿠키 생성
Cookie cookie = new Cookie(String, String);
유지 기간 설정 (초)
cookie.setMaxAge(int); - 생성한 쿠키를 response에 담아 클라이언트에게 전달
response.addCookie(cookie);
※ 쿠키 생성과 클라이언트에게 전달을 한 번에 하기 (유지 기간은 생략)
reponse.addCookie(new Cookie(String, String)); - 쿠키 확인 : Cookie(n, v); 값을 가져올 때 이름과 데이터를 무조건 같이 가져옴
Cookie[] cookies = request.getCookies();
※ for문과 .getName() .getValue()를 사용해보기
for (int i = 0; i < cookies.length; i++) {
out.print(cookies[i].getName() + " : " + cookies[i].getValue());} - 쿠키 삭제 : 쿠키를 삭제하는 메소드는 없음
쿠키 자체를 새로 덮어씌워 만들고 유지 시간을 0초로 만든 후, 클라이언트에게 전달
Cookie cookie = new Cookie("name", null);
cookie.setMaxAge(0);
response.addCookie(cookie);
<%@ 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>
<%
// Cookie(String, String)
Cookie cookie = new Cookie("test", "testCookie");
cookie.setMaxAge(60*60*24*365);
response.addCookie(cookie);
response.addCookie(new Cookie("test2","test2Cookie"));
%>
<a href="Ex01GetCookie.jsp">쿠키 확인하기</a>
</body>
</html>
<%@ 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>
<!-- 생성된 쿠키 값을 확인하는 페이지 -->
<%
// Cookie(n, v);
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
out.print(cookies[i].getName() + " : " + cookies[i].getValue());
out.print("<br>");
}
%>
<a href="Ex01RemoveCookie.jsp">쿠키 삭제하기</a>
</body>
</html>
<%@ 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>
<!-- 요청에 의해 쿠키의 값을 삭제하는 페이지 -->
<%
Cookie cookie = new Cookie("test", null);
cookie.setMaxAge(0); // 유지 시간 0초
response.addCookie(cookie);
%>
<a href = "Ex01GetCookie.jsp">쿠키 확인</a>
</body>
</html>
3. 세션 (Session)
- 브라우저가 종료되기 전까지 클라이언트의 정보를 유지하게 해주는 기술
사용자 정보 파일을 서버 측에서 관리
- 세션 동작 방식
- 세션 특징
① 각 클라이언트에게 고유 ID를 부여
② 보안 면에서 쿠키보다 우수
③ 사용자가 많아질수록 서버 메모리를 많이 차지하게 되고, 속도가 느려짐 - 세션 사용 예시
로그인 같이 보안상 중요한 작업을 수행할 때 사용
쿠키 (Cookie) | 세션 (Session) | |
사용자 정보 저장 위치 | 클라이언트 | 서버 |
보안 | 상대적으로 불안전 | 상대적으로 안전 |
속도 | 상대적으로 빠름 | 상대적으로 느림 |
생명주기 | 만료일이 되면 삭제 | 브라우저 종료 시 삭제 |
4. 세션 생성, 확인
- 세션 생성 : 내장 객체가 이미 존재함으로 따로 선언하지 않아도 된다.
session.setAttribute(String, Object); - 세션 확인
① 하나씩 값 가져오기 : Object형태로 반환되므로, 다운캐스팅 필요
(type) session.getAttribute(String);
② 한 번에 모든 세션을 가져오기
Enumeration 변수명 = session.getAttributeNames();
※ import Enumertaion 필요
가져온 세션을 출력해보기(Enumeration 타입의 세션들에서 세션을 하나씩 꺼내오기)
while(세션변수명.hasMoreElements()) {
String 변수명 = 세션변수명.nextElement().toString();
out.print(변수명);
out.print(session.getAttribute(변수명));}
<%@ 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>
<%
// 1. 세션 값 설정
// Cookie(String, String);
// session(String, Object);
session.setAttribute("id", "onlyPractice");
session.setAttribute("pw", 123);
%>
<a href = "Ex02GetSession.jsp">1. 세션 확인하기</a>
<a href = "Ex02GetSessions.jsp">2. 세션들 확인하기</a>
</body>
</html>
<%@ 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>
<!-- 1. 따로따로 값 가져오기-->
<%
String id = (String) session.getAttribute("id");
int pw = (int) session.getAttribute("pw");
%>
id : <%= id %> <br>
pw : <%= pw %>
</body>
</html>
<%@page import="java.util.Enumeration"%>
<%@ 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>
<!-- 세션의 값을 한 번에 확인할 수 있는 페이지 -->
<%
Enumeration names = session.getAttributeNames();
// 이름의 개수가 몇 개인지 모르므로 while문 사용
while(names.hasMoreElements()) {
String name = names.nextElement().toString();
out.print(name + " : ");
out.print(session.getAttribute(name));
out.print("<br>");
}
%>
</body>
</html>
▶ 실습
<%@ 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="logincheck.jsp" method="post">
아이디 : <input type='text' name='id'> <br>
비밀번호 : <input type='text' name='pw'> <br>
<input type="submit" value="로그인">
</form>
</body>
</html>
<%@ 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>
<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
if (id.equals("test") && pw.equals("12345")) {
session.setAttribute("name", "쿠키몬스터");
RequestDispatcher rd = request.getRequestDispatcher("main.jsp");
rd.forward(request, response);
} else {
RequestDispatcher rd = request.getRequestDispatcher("logininfom.jsp");
rd.forward(request, response);
}
%>
</body>
</html>
<%@ 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>
<%
session.removeAttribute("name");
response.sendRedirect("loginform.jsp");
%>
</body>
</html>
<%@ 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>
<%
String name = (String) session.getAttribute("name");
out.print(name+"님 환영합니다.");
%>
<br>
<a href=logout.jsp>로그아웃</a>
</body>
</html>
'JSP Servlet' 카테고리의 다른 글
JSP Servlet Web_MVC (0) | 2023.02.13 |
---|---|
JSP Servlet Scope (0) | 2023.02.08 |
JSP Servlet 내장 객체 (Implicit Object) (0) | 2023.02.04 |
JSP Servlet Java Server Pages 기본 (0) | 2023.01.30 |
JSP Servlet 데이터 전송 방식 Get, Post (0) | 2023.01.28 |
댓글