[JSP] Cookie를 사용한 로그인 상태 유지

Jeini·2023년 5월 2일
0

🌐 JSP

목록 보기
21/24
post-thumbnail

💡 쿠키 처리를 위한 유틸리티 클래스


매번 특정 쿠키의 값을 읽고 삭제하려면 그 긴 코드를 계속 사용해야 한다.(참고 ➡️ [클라이언트와의 대화 1: Cookie])
그렇게 되면 쿠키를 여러군데 써야 한다면은 코드의 중복이 된다.
그래서 따로 쿠키 처리를 위한 유틸리티 클래스를 만들어놓으면 편하게 쿠키에 관한 일들을 처리할 수 있다.

✏️ Cookies.java

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;
		
	}

}

💡 로그인 처리


  1. 로그인에 성공하면 특정 이름을 갖는 쿠키를 생성한다.
  2. 해당 쿠키가 존재하면 로그인한 상태라고 판단한다.
  3. 로그아웃하면 해당 쿠키를 삭제한다.
  • 로그인에 성공하면 AUTH 라는 쿠키를 생성한다.
  • AUTH 쿠키가 존재하면 로그인한 상태라고 인식한다.

일단은 아이디와 암호가 같으면 로그인에 성공한다고 가정하고 만들어보자.

✏️ loginForm.jsp

<%@ 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>

✏️ login.jsp

<%@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>
<%
	}
%>

💡 로그인 여부 판단


  1. 로그인에 성공했음을 나타내는 쿠키를 생성 ✔️
  2. 웹 브라우저는 요청을 보낼 때마다 생성되는 쿠키를 전송
    ➡️ 쿠키의 존재 여부에 따라 로그인했는지에 대한 여부도 판단 가능

❗️ 아이디를 평문 형태로 쿠키 값으로 사용하면 보안에 큰 문제가 생김

  • 현재 예제인 AUTH 쿠키는 로그인한 아이디 값으로 가지고 있는데 예제는 예제일뿐! 실제로는 ❌❌
  • 웹 브라우저는 자체적으로 개발도구를 제공하고 있는데, 이 개발도구를 사용하면 쿠키 값을 쉽게 변경 할 수 있기 때문에 쉽게 서버로 전송할 수 있다.
  • 원래는 다양한 암호화 방식으로 혼합해서 저장!

✏️ loginCheck.jsp

<%@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>

💡 로그아웃 처리


  1. 로그인에 성공하면 쿠키를 생성 ✔️
  2. 로그아웃을 처리하면 쿠키를 삭제
    ➡️ AUTH 쿠키의 유효시간을 0으로 지정

✏️ logout.jsp

<%@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>
profile
Fill in my own colorful colors🎨

0개의 댓글