[JSP] 클라이언트와의 대화 1 : Cookie

Jeini·2023년 5월 2일
0

🌐 JSP

목록 보기
20/24
post-thumbnail

🍪 Cookie


✔️ 클라이언트 식별 기술
✔️ 웹 브라우저가 보관하는 데이터

  • 웹 브라우저는 웹 서버에 요청을 보낼 때 쿠키를 함께 전송
    ➡️ 웹 서버는 웹 브라우저가 전송한 쿠키를 사용해서 필요한 데이터를 읽음
    ➡️ 서버와 브라우저의 상태값을 유지

  • JSP에서 생성하는 쿠키는 웹 서버에서 생성하는 쿠키이다.
    : 쿠키는 웹 서버와 웹 브라우저 양쪽에서 생성할 수 있다. 하지만, 클라이언트에서 쿠키를 만드는 것은 효력이 없다. 서버에서 모든 것을 처리하기 때문에 상태 정의값은 서버만 내릴 수 있기 때문이다.

  • 데이터를 서버가 다 전적으로 저장하지 않고 브라우저에 (상태)저장을 맡긴다.
    ➡️ 브라우저가 관리를 하는 것은 한계가 있다. 보조적인 수단으로 사용되는 방식.
    ➡️ 모든 브라우저에는 쿠키를 허용하지 않는 옵션이 있다. 그 옵션을 누르면 브라우저는 쿠키를 저장하지 않게 된다. 그래서 쿠키는 상황마다 다를 수 밖에 없고 보조적인 수단으로 사용되어야 한다.

❗️ 사용자가 쿠키를 아예 차단했다면 어떻게 상태저장을 할까?

📚 예를 들어, 서버는 도서관이고 쿠키는 도서관을 출입하고 책을 빌릴 수 있는 id카드라고 생각하면 된다. 그래서 사용자는 그 id카드를 버릴 수도 있고 도서관이 준 카드를 거부할 수도 있다. 도서관측에서는 사용자의 id카드를 가지고 누가 누군지 구별할 수 있게 된다.💳

⚙️ 쿠키의 동작 방식


1. 쿠키 생성 단계

  • 웹 서버에서 쿠키 먼저 생성
  • 생성한 쿠키를 응답 데이터의 헤더에 저장해서 웹 브라우저에 전송

2. 쿠키 저장 단계

  • 웹 브라우저는 응답 데이터에 포함된 쿠키를 쿠키 저장소에 보관
  • 쿠키의 종류에 따라 메모리나 파일에 저장

3. 쿠키 전송 단계

  • 웹 브라우저는 저장한 쿠키를 요청이 있을 때마다 웹 서버에게 전송
  • 웹 서버는 웹 브라우저가 전송한 쿠키를 사용해서 필요한 작업을 수행

웹 브라우저에 쿠키가 저장되면, 웹 브라우저는 쿠키가 삭제되기 전까지 웹 서버에 쿠키를 전송한다. 따라서 웹 어플리케이션을 사용하는 동안 지속적으로 유지해야 하는 정보는 쿠키를 사용해서 저장하면 된다.

💡 쿠키의 구성


  • 이름 ⭐️ : 각각의 쿠키를 구별하는 데 사용되는 이름

  • ⭐️ : 쿠키의 이름과 관련된 값

  • 유효시간: 쿠키의 유지 시간

  • 도메인: 쿠키를 전송할 도메인 (localHost8080)

  • 경로: 쿠키를 전송할 요청 경로 (웹 어플리케이션 이름부터 시작)

응답 파라미터를 받을 때에도 이름과 값을 받듯이, 쿠키의 핵심 요소도 이름이다.

✔️ 쿠키 식별자 = 이름

  • 하나의 웹 브라우저는 여러 개의 쿠키를 가질 수 있다.
    ➡️ 각 쿠키를 구분할 때 이름을 사용한다.

  • 각 쿠키는 값을 가진다.
    ➡️ 서버는 이 값을 사용해서 원하는 작업을 수행한다.

✔️ 쿠키 이름은 알파벳과 숫자만 이용한다.

  • 아스키 문자로 구성돼서 여러 문자를 사용할 수 있자만 한글을 굳이 잡아넣진 않는다.
  • 콤마, 세미콜론, 공백, 괄호, 등호기호 ❌
  • 값으로 사용할 수 있는 문자가 한정되어 있기 때문에 쿠키 값을 생성할 때에는 알맞은 방식으로 인코딩한다.
    ➡️ ex) java에서는 URL 인코딩을 사용해서 쿠키 값으로 사용할 문자열 변환 가능

✔️ 쿠키의 유지시간 ➡️ 웹 브라우저가 쿠키를 얼마 동안 보관할지 지정 가능

  • 쿠키 유효 시간을 1시간으로 지정 ➡️ 1시간 뒤 웹 브라우저는 해당 쿠키 삭제
  • 유효시간 지정 ❌ ➡️ 웹 브라우저를 종료할 때 쿠키 함께 삭제
  • 지정한 도메인이나 경로로만 쿠키를 전송하도록 제한할 수 있음

💡 쿠키 생성하기


✔️ Cookie cookie = new Cookie("쿠키 이름", "쿠키 값");
      respose.addCookie(cookie);

  • response.addCookie(cookie)
    : response 기본 객체가 웹 브라우저에 쿠키 정보를 전송

✏️ 쿠키 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder" %>

// 추가할 쿠키 정보를 담고 있는 Cookie 객체 생성
// URLEncoder 클래스를 사용해서 쿠키 값을 인코딩한다.
<%
	Cookie cookie = new Cookie("name", URLEncoder.encode("JTI", "utf-8"));
	response.addCookie(cookie); // 응답 데이터에 쿠키를 추가
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키 생성</title>
</head>
<body>

	<%= cookie.getName()%> 쿠키의 값 = <%= cookie.getValue() %>

</body>
</html>

  • 쿠키의 도메인과 경로
    : 도메인 간에 또는 특정 요청 경로에 위치한 JSP 간에 쿠키를 공유할 때 필요하다.

💡 쿠키 값 읽어오기


✔️ Cookie[] cookies = request.getCookies();

  • request.getCookies()
    : Cookie 배열을 리턴
    : 읽어올 쿠키가 없으면 null을 리턴

✏️ 웹 브라우저가 전송한 쿠키 목록을 출력

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키 목록</title>
</head>
<body>
쿠키 목록<br>
<%
	// 쿠키 배열을 구한다. 쿠키가 없으면 null을 리턴한다.
	Cookie[] cookies = request.getCookies();
	if(cookies != null && cookies.length > 0) {
		for(int i = 0; i < cookies.length; i++) {
%>
	<%= cookies[i].getName() %> = 
	<%= cookies[i].getValue() %><br>
<%
		}
	} else {

%>
	쿠키가 존재하지 않습니다.
<%
	}
%>

</body>
</html>

  • JSESSIONID 쿠키
    : session ID를 저장하는 데 사용됨
    : JSP 페이지를 방문하는 각 사용자에게 고유한 ID를 제공함
    : JSP / Servlet에서 세션 관리를 위해 사용됨

  • Idea-c19e5daf 쿠키 (이게 나만 떠서 뭔가 싶었네;;)
    : IntelliJ IDEA 또는 기타 JetBrains IDE(통합 개발 환경)를 사용할 때 자동으로 생성됨
    : 해당 IDE에서는 이 쿠키를 사용하여 세션 ID를 저장하고 관리함

💡 쿠키 값 변경


✔️ Cookie cookie = new Cookie("쿠키 이름", "새로운 값");
      respose.addCookie(cookie);

  • 쿠키의 값을 변경한다는 것 = 기존에 존재하는 쿠키의 값 변경 (덮어씌움)
  • 브라우저에 쿠키를 저장하므로, 서버 측에서는 직접적인 변경 권한을 가질 수 없다.

✏️ 기존에 생성한 name 쿠키의 값을 변경

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 쿠키 배열 뽑아옴.
	Cookie[] cookies = request.getCookies();
	
	if(cookies != null & cookies.length > 0) {
		for(int i = 0 ; i < cookies.length; i++) {
          	// name 쿠키가 존재할 경우, "name"인 쿠키 객체를 새롭게 생성해서 응답 헤더에 추가
			if(cookies[i].getName().equals("name")) {
				Cookie cookie = new Cookie("name", "PJI");
				response.addCookie(cookie);
			}
		}
		
	}

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키 값 변경</title>
</head>
<body>
name 쿠키의 값을 변경합니다.

</body>
</html>

📺 쿠키 값 읽어오기 JSP를 다시 실행했을 때 name 쿠키의 값이 잘 바뀐 것을 확인

💡 쿠키 값 삭제


✔️ Cookie cookie = new Cookie("쿠키 이름", "쿠키 값");
      cookie.setMaxAge(0);
      respose.addCookie(cookie);

  • 쿠키를 삭제하는 기능을 별도로 제공 ❌
  • cookie.setMaxAge(0);
    : 유효시간이 받자마자 끝나서 쿠키가 제거된다.

✏️ 생성한 name 쿠키를 삭제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%

	//쿠키 배열 뽑아옴.
	Cookie[] cookies = request.getCookies();
	
	if(cookies != null & cookies.length > 0) {
		for(int i = 0 ; i < cookies.length; i++) {
			if(cookies[i].getName().equals("name")) {
				Cookie cookie = new Cookie("name", "");
				cookie.setMaxAge(0);
				response.addCookie(cookie);
			}
		}
		
	}


%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키 삭제</title>
</head>
<body>
name 쿠키를 삭제합니다.

</body>
</html>

📺 쿠키 값 읽어오기 JSP를 다시 실행했을 때 name 쿠키가 없어진 것을 확인

💡 쿠키의 도메인


✔️ Cookie cookie = new Cookie("쿠키 이름", "쿠키 값");
      cookie.setDomain("도메인");
      respose.addCookie(cookie);

✅ 쿠키를 공유할 도메인 범위를 지정

기본적으로 쿠키는 그 쿠키를 생성한 서버에만 전송된다. 하지만 네이버를 생각해보면, naver.blog, naver.cafe, naver.weebtoon 처럼 같은 도메인을 사용하는 모든 서버에 쿠키를 보내야 할 때가 있다.

  • cookie.setDomain("도메인");
    : 생성한 쿠키를 전송할 수 있는 도메인 지정

⚒️ 2가지 형식으로 도메인 지정

  • .somehost.com ⭐️
    : 상위 도메인
    : 점으로 시작하는 경우 관련 도메인에 모두 쿠키를 전송
    : 대부분 이 방법을 많이 씀

  • www.somehost.com
    : 특정 도메인에 대해서만 쿠키 전송

⚙️ 쿠키 도메인이 쿠키를 생성한 서버의 도메인을 벗어나면 웹 브라우저는 쿠키를 저장하지 않음

❗️ 보안문제로 인해 웹 브라우저는 타 도메인으로 지정한 쿠키를 받지 않는다.
➡️ 웹 브라우저는 현재 서버의 도메인과 다른 도메인에 대한 쿠키 생성은 허용하지 않는다.

💡 쿠키의 경로


✔️ Cookie cookie = new Cookie("쿠키 이름", "쿠키 값");
      cookie.setPath("/");
      respose.addCookie(cookie);

✅ 쿠키를 공유할 기준 경로를 지정

  • 경로
    : URL에서 도메인 이후 부분을 말함 (localhost:8080 다음)
    : ex) /05_02/path2/viewCookies.jsp

❗️ 쿠키 경로는 / 로 지정
: 일반적으로 쿠키는 웹 어플리케이션에 포함된 다수의 JSP와 Servlet에서 사용하기 때문

💡 쿠키의 유효시간


✔️ Cookie cookie = new Cookie("쿠키 이름", "쿠키 값");
      cookie.setMaxAge();
      respose.addCookie(cookie);

  • 쿠키의 유효시간을 정해 놓으면 그 유효시간 동안 쿠키가 존재한다.
    ➡️ 웹 브라우저를 종료해도 유효시간이 지나지 않았으면 쿠키를 삭제하지 않는다.
  • cookie.setMaxAge()
    : 초 단위
    : 0 ➡️ 쿠키 바로 삭제
    : -1 ➡️ 브라우저 끄면 삭제

✏️ 쿠키의 유효시간을 1시간으로 지정

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder" %>
<%
	Cookie cookie = new Cookie("time", "1time");
	cookie.setMaxAge(60 * 60);
	response.addCookie(cookie);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키 유효시간 설정</title>
</head>
<body>

  유효시간이 1시간인 time 쿠키 생성.


</body>
</html>

❗️ 아이디 기억하기 기능의 구현 방법 ➡️ 쿠키 이용

  • 사용자가 로그인에 성공하면 아이디를 값으로 저장하고 있는 쿠키의 유효시간을 1달 정도로 여유롭게 잡아서 생성한다.
  • 비슷한 방식으로 로그인 정보를 쿠키에 보관하면 자동 로그인 기능을 구현할 수도 있다.
profile
Fill in my own colorful colors🎨

0개의 댓글