[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를 사용한다.
'Backend > Servlet & JSP' 카테고리의 다른 글
[Servlet & JSP] 서블릿 listener (0) | 2023.05.26 |
---|---|
[Servlet & JSP] 서블릿 filter (0) | 2023.05.25 |
[Servlet & JSP] 서블릿 forward와 redirect (0) | 2023.05.23 |
[Servlet & JSP] 에러 처리 (0) | 2023.05.22 |
[Servlet & JSP] 서블릿의 역할 (0) | 2023.05.21 |
댓글