본문 바로가기
Backend/Servlet & JSP

[Servlet & JSP] 서블릿 cookie와 session

by Forsaken Developer 2023. 5. 24.
728x90
728x90

[Servlet & JSP] 서블릿 cookie와 session

쿠키와 세션은 웹 개발에서 사용되는 데이터 저장 기술로 쿠키는 클라이언트 측에 저장되는 텍스트 파일이고 세션은 클라이언트에 세션 ID를 저장한다.

Cookie

클라이언트 pc에 파일 형태로 저장 되어 값을 유지하고 정해진 시간동안 서버와 클라이언트가 사용할 수 있다.

쿠키는 사용자 정보를 클라이언트 측에 파일로 저장하기 때문에 보안에 취약하고 브라우저에서 쿠키를 비활성하면 쿠키를 사용할 수 없다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>cookie</title>
</head>
<body>
	<form action="cookie" method="post">
		<label>username</label> <input type="text" name="username"> <br>
		<input type="submit" value="요청">
	</form>
</body>
</html>

먼저 쿠키를 설정을 테스트 해보기 위한 html을 작성한다.

@WebServlet("/cookie")
public class CookieHandlerServlet extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String username = request.getParameter("username");
		
		Cookie usernameCookie = new Cookie("username",username);
		
		usernameCookie.setMaxAge(60 * 60 * 24);

		response.addCookie(usernameCookie);
		
		response.sendRedirect("redirect");
	}
}

쿠키를 사용하는 절차는 쿠키를 생성하고 만료시간을 설정한 후 응답 헤더에 쿠키를 담아서 응답하는 것이다.

Cookie 객체를 생성하고 key-value 형태로 인자를 전달한다.

쿠키의 만료시간을 초 단위로 설정한 후 response의 addCookie 메서드를 통해서 쿠키를 추가한다.

브라우저에서 response Header에 쿠키와 만료시간을 확인할 수 있다.

마찬가지로 redirect된 요청 주소의 Header에서도 cookie를 활용할 수 있다.

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username = request.getParameter("username");
		
		Cookie[] cookies = request.getCookies();
		
		for(int i=0; i<cookies.length; i++) {
			System.out.println(cookies[i].getName() + " : " + cookies[i].getValue());
		}
	}
}

request 객체의 getCookies 메소드로 쿠키 리스트를 가져올 수 있고 getName과 getValue 메소드로 쿠키의 key, value를 사용할 수 있다.

쿠키의 제약 사항

  • 쿠키의 이름으로 아스키 문자만 사용
  • 한 번 설정한 쿠키의 이름은 변경 불가
  • 공백문자와 일부 특수문자 사용 불가

Session

세션도 일종의 쿠키인데 쿠키는 파일형태로 저장되는 persistence cookie이고 세션은 session cookie 라고도 한다.

사용자에게 서버의 공간을 할당하고 공간에 접근할 수 있도록 세션 ID를 header를 통해서 넘겨준다.

클라이언트는 매번 요청마다 session id를 통해서 요청을 한다.

cookie와 session의 역할은 비슷하나 데이터를 클라이언트에 저장하는지 서버에 저장하는지가 큰 차이이다.

세션은 서버 측에서 세션을 관리하기때문에 보안적 측면에서 더 이점이 있다.

세션은 각 공간을 식별하기 위한 id와 map이 key-value로 매핑되어 있다.

@WebServlet("/session")
public class SessionHandlerServlet extends HttpServlet {

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		
		String username = request.getParameter("username");
		
		HttpSession session = request.getSession();
		
		session.setAttribute("username", username);
		
		response.sendRedirect("redirect");
	}
}

세션을 사용하기 위해서 request객체의 getSession 메소드를 사용하면 된다.

세션에서 getSession 메소드를 통해서 session의 주소를 받을 수 있으며 몇번의 요청을 하더라도 동일한 주소를 반환한다.

하지만 session은 브라우저 당 하나의 session 공간이 반환되기 때문에 다른 브라우저에서 요청을 하면 다른 세션 주소를 반환한다.

session 저장소에 setAttrubute를 통해서 값을 저장하여 다른 서블릿에서 사용할 수 있다.

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		System.out.println(session.getId());
		
		String username = (String) session.getAttribute("username");
		System.out.println(username);
	}
}

다른 서블릿에서 session을 생성하고 getAttribute 메소드에 key를 넘겨 저장된 값을 사용할 수 있다. 

세션의 ID를 확인해보면 Request Header의 Cookie 영역의 JSESSIONID와 동일한 것을 확인 할 수 있다.

클라이언트는 JSESSIONID를 통해서 session 저장소의 할당된 영역에 접근한다.

@WebServlet("/delete")
public class DeleteSessionServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session  = request.getSession();
		//session.removeAttribute("username");
		session.invalidate();
	}
}

세션을 제거하는 방법으로는 2가지가 있다.

첫 번째로는 removeAttribute에 삭제하려는 key값을 전달하여 직접 제거하는 방법이다.

두 번째로는 invalidate 메소드를 사용하는 방법으로 invalidate 메소드는 세션 저장소 자체를 무효화 하여 세션을 제거한다.

보통 로그인 정보를 세션에 담아서 상태를 유지하고 로그아웃 할 때 세션을 정보를 제거하면서 로그아웃을 하는데 이 때 invalidate를 사용한다.

728x90
반응형

댓글