티스토리 뷰

web : back-end/JSP, Servlet

[JSP 기초] Cookie 에 대해 알아보자 !

무니웜테일패드풋프롱스 2020. 4. 13. 21:53

 

Cookie란 무엇일까 ? 쿠키란 말 그대로 "먹다가 흘린 쿠키" 처럼 생각하면 된다 . 쉽게 생각하여 서버와 클라이언트가 연결을 시도한 흔적이라고 생각하면 된다. 

 

http 프로토콜은 하나의 서버에 수많은 클라이언트가 붙게 되면 서버 부하가 발생하기 때문에 이를 방지하기 위해서 브라우저 (클라이언트)와 서버 사이의 응답 요청이 종료되면, 연결을 해제한다. 

하지만 로그인 페이지나, 쇼핑몰같은 페이지에서 내가 웹페이지에 정해둔 정보가 새로고침할 때마다 초기화 된다는 것은 매우 불편하다.

이를 위한것이 바로 '쿠키'이다. 쿠키는 일단, 서버에 저장되지 않고 브라우저 (클라이언트) 에 저장된다. 쿠키에는 기존의 연결 정보들이 저장되며, 나중에 다시 접속 시, 이 쿠키를 가지고 과거의 접속을 이어나갈 수 있다! 

 

그렇다면 이러한 쿠키는 어떻게 구현될까 ?

아래의  로그인 페이지 예시들을 통해 쿠키가 동작하는 방식을 알아보도록 하자.

 

먼저 코드를 보기 전에 쿠키의 기본적인 것들을 살펴보도록 하지 

 

쿠키 가져오는 법 

Cookie[] cookies = request.getCookies();

쿠키는 여러 정보들을 담고 있기 때문에 배열에 담아주도록 한다. 

 

for(Cookie c : cookies)
{ 
   c.getName(); //개발자 지정  value의 name이다. 이를 통해 어떤 value인지 파악 가능 
   c.getValue(); //Name과 fair로 값이 들어간다. 예를들면 ID나 PW 파라미터 값이 여기 들어갈 수 있다.
}

getName() 은 쿠키의 이름 

getValue() 는 쿠키에 들어간 value를 반환해준다.

원하는 정보가 쿠키에 있는지 확인해주기 위해서는 getName으로 구분해주면 되겠다.

 

그러면 로그인 페이지들을 하나씩 천천히 보자.

페이지는 3개로 되어있다.

login.jsp (로그인 폼)

:  1) 해당 브라우저에 쿠키가 있는지 확인한다 -> 있을경우 바로 loginOk 페이지로 리다이렉트 해준다. 

2) 없을 경우 로그인 폼을 띄워준다. 

 

loginCon.servlet (로그인 후 쿠키 저장)  

1) login.jsp로부터 받은 파라미터 값을 저장한다.

2) 브라우저에 쿠키가 있는지 확인한다. -> 있다면 쿠키를 저장한다. 

3) 없다면 쿠키를 새로 생성해준다.

4) 로그인 완료 loginOk.jsp로 리다이렉트 해준다.

 

loginOk.jsp (로그인 완료) 

 

1. login.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(); //쿠키 가져오기
System.out.println("cookies: " + cookies); //로그로 찍어보기 
if(cookies != null){ //쿠키 null이 아닐 경우 
	for(Cookie c: cookies){ //쿠키 조회 
		if(c.getName().equals("memberId")){ //memberID가 있을경우 
			response.sendRedirect("loginOk.jsp"); //이미 로그인이 되어잇는 것으로 판단. 
		}
	}
}

%>

<form action="loginCon" method="post">
 ID : <input type = "text" name="mID"><br>
 PW : <input type = "password" name="mPW"><br>
 <input type="submit" value="login">
</form>
</body>
</html>

 

 

2. logCon.servlet 

 

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class loginCon
 */
@WebServlet("/loginCon")
public class loginCon extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//파라미터 받아서 쿠키에 저장
		PrintWriter out = response.getWriter();
		
		String mId = request.getParameter("mID");
		String mPw = request.getParameter("mPW");
		
		out.print("mId: " + mId);
		out.print("mPw: " +mPw);
		
		
		Cookie[] cookies = request.getCookies(); //쿠키는 사용자 브라우저에 저장되어있으므로  request 객체 사용 
		 //쿠키는 여러개의 정보의 집합이므로 배열에 저장하도록
		Cookie cookie = null;
		//사용자로부터 받아온 쿠키 조회 
		for(Cookie c: cookies) {
			System.out.println("c. getName(): " + c.getName() +"c.getValue(): "+ c.getValue());
			if (c.getName().equals("memberId")) {
				cookie = c; //만약 쿠키 중에 memberId라는 쿠키가 있다면 cookie에 저장 
			}
		}
		//memeberID라는 쿠키가 없는 경우 == 처음 접속 
		if(cookie == null) {
			System.out.println("cookie is null"); 
			cookie = new Cookie("memberId", mId); //쿠키 생성. value는 사용자가 입력 한 ID 
		}
		response.addCookie(cookie); //위에서 만든 쿠키 준다
		cookie.setMaxAge(60*60); //쿠키가 유효한 시간이 1시간 
		response.sendRedirect("loginOk.jsp");
	}
		

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		doGet(request, response);
	}

}

 

3.loginOk.jsp - 테스트를 위해서 cookie의 name과 value를 출력했다 

<%@ 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(Cookie c : cookies){
	out.print("name: "+c.getName() +"<br>");
	out.print("value: "+c.getValue() +"<br>");
	out.print("-------------------------");
}
%>

</body>
</html>
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함