티스토리 뷰
Goal
- 쿠키에 대해 이해한다.
- 쿠키생성시 이용되는 메서드를 이해한다.
- 코드와 예제를 통해 쿠키설정의 절차를 이해한다.
- 일생생활과 관련된 로그인 예제를 통해 쿠키를 이해한다.
1. 쿠키란?
- 웹브라우저에서 서버로 어떤 데이터를 요청 하면, 서버측에서는 알맞은 로직을 수행한 후 데이터를 웹브라우저에 응답하고, 웹브라우저와의 관계를 종료함. (웹브라우저에 응답후 서버가 관계를 끊는 것은 http프로토콜의 특징)
- 관계를 종료하면 어떤 클라이언트가 어떤 정보를 요청했는지에 대한 정보도 사라짐.
클라이언트와 서버의 관계종료 흐름 예시) 1)클라이언트가 로그인 페이지에서 ID와 PW를 입력함 -> 2)서버가 처리하여 로그인 성공 -> 3)서버와 웹브라우저의 관계 종료 -> 4)클라이언트가 같은 사이트의 다른 페이지로 넘어가려 했을때 로그인 정보가 사라짐 -> 5)또 다시 로그인을 해야 함(페이지 이동할 때 마다),
- 이러한 불편함을 해결하고, 연결이 끊겼을 때 어떤 정보를 지속적으로 유지하기 위한 수단으로 쿠키라는 방식을 사용.
쿠키 사용방식 예시) 1)쿠키 객체에 인증된 값을 저장 -> 2)다시 로그인을 요청할 때 쿠키 객체를 확인하여 기존과 동일한 값이 있으면 그대로 처리
- 쿠키는 서버에서 생성되지만, 서버가 아닌 클라이언트측에 특정 정보를 저장함.
- 서버에 요청할 때 마다 쿠키의 속성값을 참조 또는 변경 할 수 있음.
- 쿠키는 4kb로 용량이 제한적이며, 300개까지 데이터 정보를 가질 수 있음
2. 쿠키 문법
- 쿠키는 서버에서 생성되고, 클라이언트측에 전송되어 저장됨.
2-1 쿠키 관련 메소드
- setMaxAge() : 쿠키 유효기간을 설정 ex) 1시간, 하루
- setpath() : 쿠키사용의 유효 디렉토리 설정 ex) 웹어플리케이션을 저장하는 폴더에서 유효한 디렉토리 설정
- setValue() : 쿠키의 값을 설정
- setVersion() : 쿠키 버전을 설정
- getMaxAge() : 쿠키 유효기간 정보를 얻음
- getName() : 쿠키 이름을 얻음
- getPath() : 쿠키사용의 유효 디렉토리 정보를 얻음
- getValue() : 쿠키의 값을 얻음
- getVersion() : 쿠키 버전을 얻음
3. 쿠키 예제
- 쿠키를 1)생성하고 2)속성을 설정하고 3)response객체에 탑재해서 클라이언트 로컬 컴퓨터에 보냄.
1) cookieset
- Cookie cookie = new Cookie("cookieN", "cookieV");
-> 1)쿠키를 설정하기위한 쿠키 객체 생성, 인자값으로 앞에오는게 쿠키의 Name(cookieN) 뒤에오는 값이 Value(cookiev)
- cookie.setMaxAge(60*60);
- > 1시간동안 쿠기가 유지됨. 2)속성 값을줌
- response.addCookie(cookie);
- > 응답(쿠키객체를 보냄)을 해야 하기 때문에 response객체에 cookie객체를 add해줌 3) response객체에 탑재
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<!-- cookieset.jsp에서 실행 즉, 서버에서 쿠키가 생성됨 -->
<%
Cookie cookie = new Cookie("cookieN", "cookieV");
cookie.setMaxAge(60*60);
response.addCookie(cookie);
%>
<a href="cookieget.jsp">cookie get</a> <!-- 4) cookieget.jsp로 값을 넘김. 1)번에서 생성한 쿠키가 cookie get이라는 버튼을 누르면 cookieget.jps로 넘어감-->
</body>
</html>
1-1) cookieset 실행결과
- <a href= ~,jsp">cookie get</a>태그를 통해 cookie get페이지로 이동할 수 있도록 링크가 설정되며 cookie get링크를 클릭하면 cookieset.jsp 정보가 cookieget.jsp로 넘어감.
2) cookieget
- cookieset에서 보낸 데이터를 받아주는 Java 코드 작성
- Cookie[] cookies = request.getCookies();
- > getCookies()를 통해 cookieset.jsp로부터 값(cookieN, cookieV)을 받음. 값이 여러개일 수 있으므로 배열로 받음
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
for(int i = 0; i < cookies.length; i++){ //값이 잘 받아졌는지 출력을 통해 확인하는 코드
String str = cookies[i].getName();
if(str.equals("cookieN")){
out.println("cookies[" + i + "] name:" + cookies[i].getName() + "<br/>");
out.println("cookies[" + i + "] value:" + cookies[i].getValue() + "<br/>");
out.println("======================<br/>");
}
}
%>
<a href = "cookiedel.jsp">cookie delete</a>
</body>
</html>
2) cookieget 출력결과
- 출력결과를 통해 값이 cookies[0] name, value에 각각 값이 들어가 있는 것을 볼 수 있다.
- cookie delete를 통해 쿠키를 삭제할 수 있는 페이지로 이동.
3) cookiedel
- cookies[i].setMaxAge(0);
- > 유효기간을 0으로만듬. 즉, 해당 쿠키를 삭제
- response.addCookie(cookies[i]);
- > 그 쿠키를 다시 response객체에 탑재(수정하거나, 확인을 위해서는 바뀐 값을 다시 탑재해야함)
- > 현재까지의 흐름: 생성 -> 속성변경(유효기간 0으로) -> 탑재 (현재코드))
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
for(int i = 0; i < cookies.length; i++){
String str = cookies[i].getName();
if(str.equals("cookieN")){
out.println("name: " + cookies[i].getName() + "<br/>");
cookies[i].setMaxAge(0);
response.addCookie(cookies[i]);
}
}
%>
<a href="cookietest.jsp">쿠키확인</a>
</body>
</html>
3) cookiedel 실행결과
- 삭제된 쿠키가 cookieN이라는 것을 출력 결과를 통해 확인할 수 있음.
4) cookietest
- if(cookies != null){ :
- > 쿠키객체가 null이 아니면 for문 실행(즉 값이 있으면 for문을 실행하고 값을 출력한다) , 여기에 cookie가 찍히면 안됨(다 null값이어야 함), 전에 del로 삭제했기 때문에.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
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].getName() + "<br/>");
}
}
%>
</body>
</html>
4) cookietest 실행결과
- JSESSIONID는 기본적으로 웹서버에서 출력하는 문장.
- 담겨있는 쿠키가 없으므로 완벽히 삭제 된 것을 확인할 수 있다.
4. 쿠키를 활용한 login 예제
1) login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<form action = "loginOk.jsp" method="post">
아이디 : <input type="text" name="id" size="10"><br/>
비밀번호 : <input type="password" name="pw" size="10"><br/>
<input type="submit" value="로그인">
</form>
</body>
</html>
2) loginOk.jsp
- if(id.equals("abcde")&& pw.equals("12345")){
- > 둘중에 하나라도 false값이면 else실행 -> 다시 로그인하라는 페이지로 포워딩
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%!
String id, pw; //form 태그에서 온 정보들을 저장하기 위해 선언부에서 id, pw언선
%>
<%
id = request.getParameter("id");
pw = request.getParameter("pw");
if(id.equals("abcde")&& pw.equals("12345")){
Cookie cookie = new Cookie("id", id);
cookie.setMaxAge(60);
response.addCookie(cookie);
response.sendRedirect("welcome.jsp"); //포워딩 to welcome.jsp
}else {
response.sendRedirect("login.html"); // 다시 로그인 하라! login.html로 포워딩
}
%>
</body>
</html>
3) welcome.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
for(int i = 0; i < cookies.length; i++){
String id = cookies[i].getValue();
if(id.equals("abcde")) out.println(id + "님 안녕하세요." + "<br/>"); //id가 맞으면 인사말 출력
}
%>
<a href = "logout.jsp">로그아웃</a>
</body>
</html>
4) logout.jsp
- sendRedirect는 해당 URL로 direct로 보내고(URL도 실행도 보낸 파일에서), forwarding은 URL은 해당 forwarding을 실행한 곳이지만 실행되는 서버는 forwading대상임(URL은 현재파일, 실행은 forwarding한 파일).
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(int i = 0; i < cookies.length; i++){
if(cookies[i].getValue().equals("abcde")){ //id가 abcde인 쿠키값을 삭제함
cookies[i].setMaxAge(0);
response.addCookie(cookies[i]); //변경된 속성은다시 탑재 (생성 -> 속성입력 -> 탑재원리)
}
}
}
//response.sendRedirect("login.html");
response.sendRedirect("cookietest.jsp"); //cookiestest에는 abcde가 삭제돼있는지 확인
%>
</body>
</html>
- sendRedirect코드가 수행되어 cookiestes.jsp 서버로 보내 페이지를 확인해보면, 로그아웃이 정상적으로 진행되어 쿠키가 삭제된 것을 볼 수 있다.
- 보안상의 문제로 점자적으로 쿠키를 사용하지 않지만, 중요한 기능임.
'JSP > 인프런 JSP' 카테고리의 다른 글
13. 예외 페이지 (0) | 2020.02.18 |
---|---|
12. 세션 (0) | 2020.02.15 |
10. 액션태그 (0) | 2020.02.12 |
9. JSP 본격적으로 살펴보기 -3 (0) | 2020.02.07 |
8. JSP 본격적으로 살펴보기 -2 (0) | 2020.02.07 |
- 20201204
- 20200423
- 20200421
- 20200622
- 20200413
- 20200319
- likelion
- 생활코딩리눅스
- 20200429
- 20200330
- 백준
- 20200420
- 20200510
- 20200427
- 20200424
- chapter8
- chapter7
- 20200403
- 20200804
- 20200512
- 20200406
- 20200317
- 20200415
- 20200428
- 20200624
- 20200417
- 20200503
- 20200425
- 20200504
- 20200502
- Total
- Today
- Yesterday