매번 특정 쿠키의 값을 읽고 삭제하려면 그 긴 코드를 계속 사용해야 한다.(참고 ➡️ [클라이언트와의 대화 1: Cookie])
그렇게 되면 쿠키를 여러군데 써야 한다면은 코드의 중복이 된다.
그래서 따로 쿠키 처리를 위한 유틸리티 클래스를 만들어놓으면 편하게 쿠키에 관한 일들을 처리할 수 있다.
package kr.ac.jipark09;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
public class Cookies {
// 쿠키를 <쿠키이름, Cookie 객체> 쌍 형태로 저장하는 맵 생성
private Map<String, Cookie> cookieMap = new HashMap<>();
public Cookies(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for(int i = 0; i < cookies.length; i++) {
cookieMap.put(cookies[i].getName(), cookies[i]);
}
}
}
public Cookie getCookie(String name) {
return cookieMap.get(name);
}
public String getValue(String name) throws IOException {
Cookie cookie = cookieMap.get(name);
if(cookie == null) {
return null;
}
return URLDecoder.decode(cookie.getValue(), "utf-8");
}
public boolean exists(String name) {
return cookieMap.get(name) != null;
}
public static Cookie createCookie(String name, String value) throws IOException {
return new Cookie(name, value);
}
public static Cookie createCookie(String name, String value, String path, int maxAge) throws IOException {
Cookie cookie = new Cookie(name, value);
cookie.setPath(path);
cookie.setMaxAge(maxAge);
return cookie;
}
public static Cookie createCookie(String name, String value, String domain, String path, int maxAge) throws IOException {
Cookie cookie = createCookie(name, value, path, maxAge);
cookie.setDomain(domain);
return cookie;
}
}
- 로그인에 성공하면 특정 이름을 갖는 쿠키를 생성한다.
- 해당 쿠키가 존재하면 로그인한 상태라고 판단한다.
- 로그아웃하면 해당 쿠키를 삭제한다.
AUTH
라는 쿠키를 생성한다.AUTH
쿠키가 존재하면 로그인한 상태라고 인식한다.일단은 아이디와 암호가 같으면 로그인에 성공한다고 가정하고 만들어보자.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login Form</title>
</head>
<body>
<form action="<%= request.getContextPath() %>/login.jsp" method="post">
아이디 <input type="text" name="id"><br>
암호 <input type="password" name="password"><br>
<input type="submit" value="전송">
</form>
</body>
</html>
<%@page import="kr.ac.jipark09.Cookies"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String id = request.getParameter("id");
String password = request.getParameter("password");
if(id.equals(password)) {
response.addCookie(Cookies.createCookie("AUTH", id, "/", -1));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 성공</title>
</head>
<body>
<h1>Login Success!</h1>
</body>
</html>
<%
} else {
%>
<script>
alert("login fail!");
// history: 방문기록
// -1: 이전 페이지로 돌아감
history.go(-1);
</script>
<%
}
%>
- 로그인에 성공했음을 나타내는 쿠키를 생성 ✔️
- 웹 브라우저는 요청을 보낼 때마다 생성되는 쿠키를 전송
➡️ 쿠키의 존재 여부에 따라 로그인했는지에 대한 여부도 판단 가능
❗️ 아이디를 평문 형태로 쿠키 값으로 사용하면 보안에 큰 문제가 생김
AUTH
쿠키는 로그인한 아이디 값으로 가지고 있는데 예제는 예제일뿐! 실제로는 ❌❌<%@page import="kr.ac.jipark09.Cookies"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookies cookies = new Cookies(request);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 여부 검사</title>
</head>
<body>
<%
if(cookies.exists("AUTH")) {
%>
아이디 "<%= cookies.getValue("AUTH") %>"로 로그인 한 상태
<%
} else {
%>
로그인하지 않은 상태
<%
}
%>
</body>
</html>
- 로그인에 성공하면 쿠키를 생성 ✔️
- 로그아웃을 처리하면 쿠키를 삭제
➡️AUTH
쿠키의 유효시간을 0으로 지정
<%@page import="kr.ac.jipark09.Cookies"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.addCookie(Cookies.createCookie("AUTH", "", "/", 0));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그아웃</title>
</head>
<body>
<h1>로그아웃 하였습니다.</h1>
</body>
</html>