쿠키
연결이 끊겼을때 어떤 정보를 지속적으로 유지하기 위해서 쿠키 사용한다,
현제 보안에 취약하기 때문에 거의 쓰이지 않는다. => 현재는 세션사용
맥락 이해 필요.
쿠키 생성 삭제 예제
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 쿠키(Cookie)
: 웹 페이지들 사이의 공유 정보를 클라이언트 PC에 저장해 놓고 사용하는 방법.
보안이 취약함
클라이언트 브라우저에서 사용 유무를 설정할수 있음.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키 만들기</title>
</head>
<body>
<h1>서버에서 쿠키를 생성하는 cookieSet.jsp페이지 입니다.</h1>
<%
System.out.println("(아래)서버에서 쿠키를 생성하였으며, 응답하기 위해서 reponse객체에 추가 하였습니다.");
request.setCharacterEncoding("UTF-8");
/*
1)쿠키는 보통 클라이언트가 접속을 하면 서버쪽에서 생성하여
해당 클라이언트에게 보내어 로컬 PC에 저장하는 방식임.
2)쿠키속성(이름, 값)을 설정할때는 한글로 만들어지지 않기 때문에
반드시 영문이나 숫자로만 설정해야함.
*/
Cookie cookie = new Cookie("gumi", "202101");
cookie.setMaxAge(60*60); //쿠키의 유효시간 설정(1시간)
//쿠키속성을 지정했다면, 반드시 reponse객체에 추가해줘야 함.(변경이 있어도 재추가)
response.addCookie(cookie);
%>
<br/><br/>
<a href="cookieGet.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>쿠키 속성 읽기</title>
</head>
<body>
<h1>쿠키 속성들의 내용을 읽는 cookieGet.jsp페이지 입니다.</h1>
<%
System.out.println("서버에서 쿠키를 생성하였으며, 생성된 쿠키의 값을 출력해봅니다.");
//요청들어오는 쿠키들의 값들을 받음.
Cookie[] cookies = request.getCookies();
for(int i = 0; i<cookies.length; i++){
String name = cookies[i].getName();
String value = cookies[i].getValue();
if(name.equals("gumi")) {
out.println("cookies[" +i+ "]'s name : " +name);
out.println("<br/>");
out.println("cookies[" +i+ "]'s value : " +value);
}
}
%>
<br/><br/>
<a href="cookieDel.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>쿠키 삭제</title>
</head>
<body>
<h1>쿠키 속성을 삭제하는 cookieDel.jsp페이지 입니다.</h1>
<%
System.out.println("(아래) 서버에서 쿠키를 삭제하였습니다.");
//요청들어오는 쿠키들의 값들을 받음.
Cookie[] cookies = request.getCookies();
for(int i = 0; i<cookies.length; i++){
String name = cookies[i].getName(); //쿠키 이름을 얻음
String value = cookies[i].getValue(); //쿠키 값을 얻음
if(name.equals("gumi")) {
out.println("cookies[" +i+ "]'s name : " +name);
out.println("<br/>");
out.println("cookies[" +i+ "]'s value : " +value);
cookies[i].setMaxAge(0); //유효기간을 0초로 설정 => 삭제하는 효과와 동일
//쿠키 수정이 있었으므로 다시 reponse객체에 쿠키를 추가
response.addCookie(cookies[i]);
}
}
%>
<br/><br/>
<a href="cookieCheck.jsp">쿠키 확인</a>
</body>
</html>
(여기서 반드시 기억해야 할것은) 쿠키를 생성하고 reponse객체에 추가해주어야한다.
또한 변경이 일어나면 반드시 response객체에 재추가 해주어야한다.
=> 쿠키값이 일관성 있게 유지된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키 확인</title>
</head>
<body>
<h1>쿠키 속성이 삭제된 것을 확인하는 cookieCheck.jsp페이지 입니다.</h1>
<%
System.out.println("현재 쿠키 체크합니다.");
Cookie[] cookies = request.getCookies();
//유효한 쿠키 체크
if(cookies != null) {
for(int i = 0; i<cookies.length; i++) {
out.println("현재 남아있는 쿠키 이름 : " +cookies[i].getName()+ "<br/>");
out.println("현재 남아있는 쿠키 값 : " +cookies[i].getValue()+ "<br/>");
}
}
/*
확인해보니
현재 남아있는 쿠키 이름 : JSESSIONID --> 서버에서 생성함
현재 남아있는 쿠키 값 : C44E49D6AA8F55CC86AAAD2ABBFB936F --> 서버에서 생성함
위의 이름과 값은 그냥 무시하면 됨.(이부분은 항상 출력됨)
*/
/*
(여기서 반드시 기억해야 할것은) 쿠키를 생성하고 reponse객체에 추가해주어야한다.
또한 변경이 일어나면 반드시 response객체에 재추가 해주어야한다.
=> 쿠키값이 일관성 있게 유지된다.
*/
%>
</body>
</html>
로그인 활용 쿠기 적용확인 => (세션과 이어진다.)
login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>
<h1>로그인 페이지입니다.</h1>
<form action="loginOk.jsp" method="post">
아이디 : <input type="text" name="id" size="12" required="required" /><br/>
비밀번호 : <input type="password" name="pw" size="12" required="required" /><br/>
<input type="submit" value="로그인" />
<input type="reset" value="초기화" />
</form>
</body>
</html>
loginOk.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 확인</title>
</head>
<body>
<%!
String id, pw;
%>
<%
id = request.getParameter("id");
pw = request.getParameter("pw");
/*
지금은 DB를 설정하지 않아서 아래와 같이 코드 작성함.
추후 DB연동하고 난뒤 코드 볁경.
*/
if(id.equals("gumi") && pw.equals("202101")) {
//쿠키 이름은 id, 값은 gumi
Cookie cookie = new Cookie("id", id);
cookie.setMaxAge(60); //유효기간 설정
response.addCookie(cookie);
//로그인 성공하면 sendRedirect() 이용하여 login_success.jsp파일로 이동.
response.sendRedirect("login_success.jsp");
}
else {
//로그인 실패하면 sendRedirect() 이용하여 login_fail.jsp파일로 이동.
response.sendRedirect("login_fail.jsp");
}
%>
</body>
</html>
login_success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 성공</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
for(int i = 0; i<cookies.length; i++){
String id = cookies[i].getValue(); //실제 아이디 값 얻는 코드
if(id.equals("gumi")) {
out.println(id +"님 반값습니다.");
}
}
%>
<h1>환영합니다.</h1>
<a href="logout.jsp">로그아웃</a>
<script type="text/javascript">
alert("로그인 성공");
</script>
</body>
</html>
logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그아웃</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(int i = 0; i<cookies.length; i++){
String id = cookies[i].getValue(); //실제 아이디 값 얻는 코드
if(id.equals("gumi")) {
cookies[i].setMaxAge(0); //쿠키 삭제됨.
response.addCookie(cookies[i]); //쿠키가 변경되어 다시 추가함.
out.println(id + "님이 로그아웃 하셨습니다.");
}
}
}
%>
<br/><br/>
<a href="cookieCheck.jsp">쿠키 확인</a>
</body>
</html>
login_fail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 실패</title>
</head>
<body>
<!-- 자바스크립트 alert함수 이용해서 메시지 창 띄우고
다시 login.html 파일로 이동시킴 -->
<script type="text/javascript">
alert("로그인 실패");
location.href="login.html";
</script>
</body>
</html>
세션이란?
세션도 쿠키와 마찬가지로 서버와의 관꼐를 유지하기 위한 수단이다.
단, 쿠키와 달리 클라이언트의 특정 위치에 저장되는 것이 아니라, 서버 상에 객체로 존재한다.
세션의 흐름도
세션 관련 메서드
1. 세션(Session)
- 웹 페이지들 사이의 공유 정보를 서버의 메모리에 저장해 놓고 사용하는 방법
2. 세션의 특징
- 정보가 서버의 메모리에 저장
- 쿠키보다 보안에 유리
- 브라우저(사용자)당 한개의 세션(sessionId)이 생성됨.
- 세션은 유효 시간을 가짐(30분)
- 로그인 상태 유지 기능이나 소핑몰은 장바구니 담기 기능들에 주로 사용됨.
세션 만들기 예제
sessionInit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!--
1. 세션(Session)
- 웹 페이지들 사이의 공유 정보를 서버의 메모리에 저장해 놓고 사용하는 방법
2. 세션의 특징
- 정보가 서버의 메모리에 저장
- 쿠키보다 보안에 유리
- 브라우저(사용자)당 한개의 세션(sessionId)이 생성됨.
- 세션은 유효 시간을 가짐(30분)
- 로그인 상태 유지 기능이나 소핑몰은 장바구니 담기 기능들에 주로 사용됨.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션만들기</title>
</head>
<body>
<%
//세션의 속성을 지정하는 코드
session.setAttribute("gumi", 202102);
session.setAttribute("zoom", "jsp");
session.setAttribute("daegu", "mysql");
/* 스크립트릿으로 내부객체인 session객체를 이용하여 값을 설정함
현재 이 jsp파일이 서버에 요청을 하게되면 컨테이너가 jsp파일 서블릿으로 변환함.
=>session객체가 자동으로 생성되면서 컴파일이 이루어진다.*/
%>
<a href="sessionGet.jsp">세션값 확인</a>
</body>
</html>
sessionGet.jsp
<%@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>세션 값 확인</title>
</head>
<body>
<%
/*
세션에 저장한 각 속성의 Name에 대한 value를 출력함.
=> session의 getAttribute()의 변환타입이 Object타입이라서
강제로 다운케스팅 했다.
*/
Object obj1 = session.getAttribute("gumi"); //속성값 얻기
Integer intValue = (Integer)obj1; //downcasting
out.print("gumi : " +intValue+ "<br/>"); //출력
Object obj2 = session.getAttribute("zoom"); //속성값 얻기
String str = (String)obj2; //downcasting
out.print("zoom : " +str+ "<br/>"); //출력
%>
<br/>
<%
out.println("==============================================<br/>");
String sName;
String sValue;
Enumeration<String> enumeration = session.getAttributeNames();
//가져올 데이터가 있느냐?
while(enumeration.hasMoreElements()){
sName = enumeration.nextElement(); //있으면 가져와라
sValue = session.getAttribute(sName).toString();
out.println("sName : " +sName+ "<br/>");
out.println("sValue : " +sValue+ "<br/>");
}
out.println("==============================================<br/>");
/*
sessionId는 웹브라우저당 하나가 생기는 유니크한 값임.
당연히 서버에서 생성해준다.
*/
String sessionId = session.getId();
out.println("sessionId : " +sessionId+ "<br/>");
out.println("==============================================<br/>");
int sessionInterval = session.getMaxInactiveInterval();
out.println("세션 유효시간(초) : " +sessionInterval+ "<br/>");
%>
</body>
</html>
C:\Program Files\Apache Software Foundation\Tomcat 8.5\conf\web.xml에서 유효시간(서버설정) 변경가능