Rev Notebook

[JSP] 5. 쿠키와 세션

by Rev_

내가 사용하는 웹 페이지에서 페이지를 새로고침할 때마다 다시 로그인을 해야한다면 매우 불편할 것이다. 그렇다면 웹 브라우저는 일정 시간 동안은 로그인을 유지하고자 하는 기능이 필요하다. 이때 사용되는 것이 쿠키와 세션이다.

쿠키(Cookie)세션(Session)은 모두 request와 response가 종료된 웹 브라우저와 서버에서 정보를 제공해주는 역할을 한다.

 

쿠키(Cookie)

쿠키란 프로그램에서 남긴 흔적이다. 풀어서 설명하자면, 서버와 클라이언트가 연결을 시도한 흔적이며, 다시 연결할 때 이 흔적을 가지고 연결을 다시 이어나간다.

보통 클라이언트와 서버의 request, response가 종료되면 연결이 해제된다. 하지만 로그인 정보가 같은 것이 연결 정보를 잃어버리면 상당히 불편할 것이다. 따라서 Cookie는 기존 연결정보를 저장 시켜주는 역할을 한다.

<%@page language="java" contentType="text/html; charset=EUC-KR"
 pageEncoding="EUC-KR"%>
 <!DOCTYPE html>
 <html>
 	<head>
 		<meta charset="EUC-KR">
 		<title>Insert title</title>
 	</head>
 	<body>
 		<!-- cookie가 있을 경우에는 로그인 창 X -->
 		<%
 			Cookie[] cookies = request.getCookies();
 			
 			if (cookies != null) {
 				for (Cookie c : cookies) {
 					if (c.getName().equals("memberId")) {
 						response.sendRedirect("loginOk.jsp");
 					}
 				}
 			}
 		%>
 	
 		<form action="LoginCon" method="post">
 			ID : <input type="text" name="mID"><br>
 			PW : <input type=text name="mPW"><br>
 			<input type="submit" value="login"><br>
 		</form>
 	</body>
 </html>

login.jsp

먼저 로그인창을 띄워주는 jsp 페이지이다.

로그인창을 띄워주기 전에, 만일 로그인 정보가 있는 쿠키가 존재한다면 로그인 창을 띄울 필요가 없다.

따라서 쿠키가 존재한다면 loginOk.jsp 페이지로 넘어가도록 한다.

만일 쿠키가 없다면, 로그인 페이지를 띄워야할 것이다. <form> 태그를 활용하여 아이디와 패스워드를 제출하면 LoginCon에 post 방식으로 넘겨준다.

 

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;

@WebServlet("/LoginCon")
public class LoginCon extends HttpServlet {
	private static final long serialVersionUID = 1L;

	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 저장
		// 쿠키에는 하나의 정보만 있는 것이 아니라 여러 정보가 있을 수 있으므로 배열로 관리
		Cookie[] cookies = request.getCookies();
		Cookie cookie = null;
		
		for (Cookie c : cookies) {
			if (c.getName().equals("memberId")) {
				cookie = c;
			}
		}
		if (cookie == null) {
			System.out.println("cookie is null");
			cookie = new Cookie("memberId", mID);
		}
		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);
	}
}

LoginCon.java

jsp 페이지에서 데이터를 넘겨주는 서블릿 클래스이다.

getParameter를 통하여 입력한 아이디와 패스워드를 받아올 수 있다.

Cookie[] cookies = request.getCookies();웹 브라우저의 쿠키를 가져오는 역할을 한다. 

Cookie cookie = new Cookie("내가 생성하려는 쿠키 ID", value);
cookie.setMaxAge(60*60*24); //쿠키 유효 기간
cookie.setPath("/"); //모든 경로에서 접근 가능하도록 설정
response.addCookie(cookie);

쿠키를 생성할 때 기본 형식은 위와 같다.

이렇게 웹 브라우저에 쿠키를 저장하고 loginOk.jsp 페이지로 넘겨주게 된다.

 

세션(Session)

세션이 하는 역할도 쿠키와 비슷하다. 하지만 차이점은 쿠키는 웹 브라우저에 생성이 되지만, 세션서버에서 생성되어 저장된다는 것이다.

쿠키는 보안에 취약하다는 단점이 있다. 그래서 보안 문제를 방지하기 위해 고안된 것이 세션인데, 비밀번호 같이 인증 정보를 쿠키에 저장하지 않고, 사용자의 식별자인 JSESSIONID(session id)로 저장한다.

서버는 해당 세션ID로 정보를 관리하기 때문에 훨씬 보안상 안전할 수 있다.

<%@page language="java" contentType="text/html; charset=EUC-KR"
 pageEncoding="EUC-KR"%>
 <!DOCTYPE html>
 <html>
 	<head>
 		<meta charset="EUC-KR">
 		<title>Insert title</title>
 	</head>
 	<body>
 	
 		<%
 			if (session.getAttribute("memberId") != null) {
 				response.sendRedirect("loginOkSession.jsp");
 			}
 		%>
 	
 		<form action="LoginConSession" method="post">
 			ID : <input type="text" name="mID"><br>
 			PW : <input type="text" name="mPW"><br>
 			<input type="submit" value="login">
 		</form>
 	</body>
 </html>

loginSession.jsp

해당 jsp 페이지는 로그인창이다. 만약 세션ID가 "memberId"인 값이 존재한다면 로그인 완료 페이지인 loginOkSession.jsp 페이지로 넘어가도록 하게 두었다.

세션이 존재하지 않아서 로그인창이 떴다면, 아이디와 패스워드 정보를 입력하여 제출하면 LoginConSession 클래스로 넘어가게 된다.

package com.servlet;

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

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

@WebServlet("/LoginConSession")
public class LoginConSession extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		
		String mID = request.getParameter("mID");
		String mPW = request.getParameter("mPW");
		
		// 세션을 담을 때에는 HttpSession 이라는 인터페이스를 사용한다.
		HttpSession session = request.getSession();
		session.setAttribute("memberId", mID);
		
		response.sendRedirect("loginOkSession.jsp");
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

LoginConSession.java

앞서 쿠키를 사용할 때는 Cookie 객체를 사용하였다. 세션을 담기 위해서는 HttpSession 이라는 인터페이스를 사용하여야 한다.

jsp 페이지를 통해 넘어온 아이디 정보를 세션에 저장하고, loginOkSession.jsp 페이지로 넘겨주는 간단한 작업이다.

이번에는 추가로 loginOkSession.jsp 페이지에서 로그아웃하는 기능을 구현해보도록 하자.

<%@page language="java" contentType="text/html; charset=EUC-KR"
 pageEncoding="EUC-KR"%>
 <!DOCTYPE html>
 <html>
 	<head>
 		<meta charset="EUC-KR">
 		<title>Insert title</title>
 	</head>
 	<body>
 		<%
 			session = request.getSession();
 			out.print("memberId : " + session.getAttribute("memberId") + "<br>");
 		%>
 		
 		<form action="LogoutConSession" method="post">
 			<input type="submit" value="logout">
 		</form>
 	</body>
 </html>

loginOkSession.jsp

해당 페이지는 세션에 저장되어 있는 아이디 정보와 로그아웃 버튼을 구현한다.

로그아웃 버튼을 누르면 LogoutConSession 서블릿으로 넘어간다.

package com.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/LogoutConSession")
public class LogoutConSession extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		session.invalidate();
		
		response.sendRedirect("loginSession.jsp");
	}

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

LogoutConSession.java

invalidate()를 통해 세션을 삭제하고, 기존의 로그인 페이지로 넘어가는 기능을 구현하였다.

 

[Reference]

실전 JSP (renew ver.) - 신입 프로그래머를 위한 강좌

https://lovefor-you.tistory.com/247

블로그의 정보

Hi Rev

Rev_

활동하기