HTTP의 단점을 보안하기 위해서도 사용하며,
웹상에서 클라이언트의 상태를 유지하기 위한 방법으로 Session과 Cookie를 사용한다.
Cookie란? ( 서버 -> 클라이언트 )
서버가 클라이언트에 저장하는 정보로서 클라이언트 쪽에 필요한 정보를 저장해놓고
필요할 때 추출하는 것을 지원하는 기술
- Servlet Container가 사용자 웹 브라우저에 key/value로 구성된 한 쌍의 텍스트 파일을 저장하는 방법
- 사용자 정보가 네트워크를 통해 서버와 클라이언트 사이에서 지속적으로 유지되기 때문에 네트워크의 부하를 초래
- 브라우저가 종료되는 순간에 같이 없어지지만, 만기일자를 설정함으로써 쿠키를 지속적으로 유지, 중단
CookieTest1
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 | package com.bit.test; import java.io.IOException; 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("/Cookie1") public class CookieTest extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie c1 = new Cookie("key1" , "01"); // 쿠키 생성 c1.setPath("/Web/Cookie2"); // 쿠키 경로 설정 response.addCookie(c1); // 쿠키 전송 Cookie c2 = new Cookie("key2","02"); c2.setMaxAge(60* 60* 30); // 쿠키 유효시간 설정 c2.setPath("/Web/Cookie2"); response.addCookie(c2); } } | cs |
CookieTest2
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 | package com.bit.test; import java.io.IOException; 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("/Cookie2") public class CookieTest2 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie[] list = request.getCookies(); // 쿠키 추출 for(Cookie c : list) { System.out.println(c.getName() + " , " + c.getValue()); } // getName() : 쿠키 검색, getValue() : 쿠키 값 추출 } } | cs |
CookieTest1 서블릿을 실행 후, CookieTest2 서블릿을 실행했을때 콘솔에 찍히는 로그는 아래와 같다.
여기서, 브라우저를 닫고 CookieTest2 서블릿만 실행시키면 결과는
위 key2 값 하나만 나오게 된다. 왜냐하면 setMaxAge를 설정하지 않은 쿠키는 브라우저가 닫힐때 소멸되기 때문이다.
Cookie 사용 예
- ID 저장 (자동 로그인)
- 일주일간 다시 보지 않기
- 최근 검색한 상품들을 광고에 추천
- 쇼핑몰 장바구니 기능
Session이란? ( 클라이언트 -> 서버 )
사용자에 대한 정보를 조회하거나 저장하는 위치를 클라이언트가 아닌 서버상의 세션 객체에 유지하는 방법
- 사용자의 정보가 서버에 있고, 단지 세션ID만을 클라이언트와 서버간 통신하기 때문에 네트워크 이용에 있어 효율적.
HttpSession 이라는 인터페이스 객체로 표현되며, 이 객체는 요청을 보내온 클라이언트와 서버간에 일정 시간동안 각 클라이언트의 상태정보를 서버에 저장하여 유지하고자 하는 목적으로 사용되는 객체이다.
*세션 트래킹(session tracking) : 클라이언트마다 상태정보를 일정시간 동안 개별적으로 유지하여 사용하는 기술
sessionInit.jsp 와 sessionGet.jsp
내장 객체인 session에 데이터를 저장하고, setMaxInactiveInterval을 통해 시간을 지정해줄 수 있다. (10초로 지정함)
주어진 시간이 지나면 세션이 만료되어 데이터가 사라지는 것을 확인해볼 수 있다.
세션 강제 삭제
- session.invalidate() 는 모든 세션을 강제 종료하는 것이고,
- session.removeAttribute("지울 세션 값") 은 많은 세션 중 하나의 값을 지우는 것이다.
Ex) session.getAttribute로 세션 확인
이전 화면에서 setAttribute를 활용하여 세션을 저장하고, 다음 화면에 getAttribute를 사용하여 불러보았다.
이렇게 세션이 찍히는 것을 확인해 볼 수 있다.
하지만,
관리자 모드에서 Application에서 세션 값이 찍히지 않는다. 왜 그런 것일까?
세션과 브라우저의 개발자 도구의 Application 탭에 있는 Session Storage는 다른 것이다.
session 사용 예
- 사이트내에서 화면 이동해도 로그인이 풀리지 않고 유지.
- 장바구니
세션 및 서버 측 저장
세션은 서버 측에서 관리되는 상태 정보이며, 서버에 저장된다. 클라이언트 브라우저의 "Application" 탭에서 직접적으로 세션 정보를 확인하는 것은 일반적으로 어렵거나 불가능하다. 세션 정보는 서버에 저장되고 유지되므로 브라우저의 "Application" 탭에서 볼 수 없다.
Session Stroage
브라우저의 로컬 저장소 중 하나이다. 이는 클라이언트 측에서 작은 데이터를 키-값 쌍으로 저장한다. 세션과는 별개의 개념으로, 브라우저 내에서만 작동하며 서버 측에 저장되지 않는다. 브라우저를 종료하면 삭제된다.
따라서, 세션 정보는 주로 서버 측에서 관리되고 저장되며, "Session Storage"와는 다른 메커니즘이다. "Application" 탭의 "Session Stroage"는 브라우저 내에서 로컬 데이터를 저장하기 위한 용도로 사용되는 것이고, 세션 정보를 그곳에서 확인하는 것은 일반적으로 불가능하다.
Cookie - 문자열만 처리 가능
Session - 객체형태의 데이터도 처리 가능
쿠키 VS 세션
쿠키(Cookie) | 세션(Session) | |
저장 위치 | 클라이언트(접속자 PC) | 웹 서버 |
저장 형식 | text | Object |
만료 시점 | 쿠키 저장시 설정 (브라우저 종료해도 만료시점 지나지 않으면 자동삭제안됨) |
브라우저 종료시 삭제 |
사용하는 지원(리소스) | 클라이언트 리소스 | 웹 서버 리소스 |
용량 제한 | 하나의 도메인 당 20개 하나의 쿠키 당 4KB 총 300개 |
서버가 허용하는 한 용량제한 X |
속도 | 빠름 | 느림 |
보안 | 낮음 | 높음 |
쿠키와 세션의 궁극적인 차이 - 사용자의 기록 정보가 저장되는 위치
쿠키 - 서버의 자원을 전혀 사용하지 않음
세션 - 서버의 자원을 사용
'✨ Back-end > Servlet' 카테고리의 다른 글
[Servlet] 서블릿 컨테이너 정의 및 역할, HTTP 요청 처리 순서 (0) | 2023.08.08 |
---|---|
서블릿(Servlet)과 CGI ( Common Gateway Interface ) 차이 (0) | 2023.08.08 |
Servlet - 서블릿(실행 코드 방식)과 JSP(스크립트 방식) (0) | 2023.08.08 |
HTTP 프로토콜의 특징 (0) | 2023.08.08 |
[Servlet / 오류] Server Tomcat v9.0 Server at localhost failed to start. (0) | 2023.03.06 |
댓글