네트워크

Cookie와 Session

songu1 2023. 3. 19. 22:11

쿠키와 세션을 사용하는 이유 - HTTP 프로토콜의 특징이자 약점을 보완하기 위해 사용

 

HTTP 프로토콜의 특징

  1. Connectionless 프로토콜 (비연결 지향)
    클라이언트가 서버에 요청(Request) 했을 때 그 요청에 맞는 응답(Response)을 보낸 후 연결을 끊는 처리방식
  2. Stateless 프로토콜
    커넥션을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성

🚨 정보가 유지되지 않으면 매번 페이지를 이동할 때마다 로그인을 다시 하거나, 상품을 선택했는데 구매 페이지에서 선택한 상품의 정보가 없거나 하는 등의 일이 발생할 수 있음
⇒ Stateful 경우를 대처하기 위해 쿠키와 세션을 사용

 

쿠키와 세션의 차이 : 상태 정보의 저장 위치

  • 쿠키 : 클라이언트(로컬 pc) 에 저장
  • 세션 : 서버에 저장

 

[1] Cookie

HTTP의 일종으로 사용자가 어떤 웹사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일

  • HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장했다가 필요 시 정보를 참조하거나 재사용 할 수 있음

 

특징

  • 이름, 값, 만료일(저장기간), 경로 정보로 구성
  • 최소한의 정보만 사용해야함. 보안에 민감한 데이터 포함하면 안됨
  • 쿠키 정보는 항상 서버에 전송됨. 쿠키가 많아질수록 네트워크 트래픽이 추가로 발생
  • 보안에 매우 취약 → admin의 쿠키값을 가져올 수 있다면 내가 해당 사이트의 admin이 되서 공격이 가능

동작 순서

  1. 클라이언트가 페이지 요청(사용자가 웹사이트에 접근)
  2. 웹 서버는 쿠키를 생성
  3. 생성한 쿠키에 정보를 담아 HTTP 화면을 돌려줄 때, 같이 클라이언트에게 돌려줌
  4. 넘겨받은 쿠키는 클라이언트가 가지고 있다가(로컬 PC에 저장) 다시 서버에 요청할 때 요청과 함께 쿠키를 전송
  5. 동일 사이트 재방문 시 클라이언트의 PC에 해당 쿠키가 있는 경우 요청페이지와 함께 쿠키를 전송

사용 예시

  • 방문 사이트에서 로그인 시 “아이디와 비밀번호를 저장하겠습니다?”
  • 팝업창을 통해 “오늘 이 창을 다시 보지 않기” 체크
  • 광고 정보 트래킹

 

[2] Session

일정 시간동안 같은 사용자(같은 브라우저)로 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술

  • 일정시간 : 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점 ~ 웹브라우저를 종료하여 연결을 끝내는 시점
  • 방문자가 웹서버에 접속해 있는 상태를 하나의 단위로 보고 세션이라 칭한다

 

특징

  • 웹 서버에 웹 컨테이너으 상태를 유지하기 위한 정보를 저장
  • 웹 서버에 저장되는 쿠키(=세션 쿠키)
  • 브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제가 되므로 쿠키보다 비교적 보안이 좋음
  • 서버 용량이 허용하는 한에서 저장 데이터에 제한이 없음
  • 각 클라이언트에 고유 Session ID를 부여
    • Session ID로 클라이언트를 구분해 각 요구에 맞는 서비스를 제공
  • Session 객체들마다 저장해둔 데이터를 이용한다

동작순서

  1. 클라이언트가 페이지 요청(사용자가 웹사이트에 접근)
  2. 서버는 접근한 클라이언트의 Request-Header 필드인 쿠키를 확인하여 클라이언트가 해당 session-id를 보냈는지 확인
  3. session-id가 존재하지 않는다면 서버는 session-id를 생성해 클라이언트에게 돌려줌
  4. 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장
  5. 클라이언트는 재접속 시 이 쿠키를 이용해 session-id값을 서버에 전달

사용 예시

  • 화면을 이동해도 로그인이 풀리지 않고 로그아웃하기 전까지 유지

Spring에서 세션 적용하기

[1] 세션에 데이터 저장 : session.setAttribute(”저장하고자하는 변수명”, 저장변수값); 

Controller

@RequestMapping("/test")
public String test(HttpServletRequest request) throws Exception{
	HttpSession session = request.getSession();
    String name="song";
    session.setAttribute("sessionId", name);
    return "test/test";
}

 

View - thymeleaf 템플릿엔진

<body>
	<h2 th:text="${sessionId}"></h2>
</body>

[2] 세션에 저장된 데이터 가져오기 : session.getAttribute(”저장한 변수명”);

Controller

@RequestMapping("/test2")
public String test2(HttpServletRequest request) throws Exception{
	HttpSession session = request.getSession();
    String name=(String) session.getAttribute("sessionId");
    System.out.println("세션에 저장된 변수 : "+name);
    session.setAttribute("sessionId",name);
    return "test/test";
}

 

View - thymeleaf

<body>
	<h2 th:text="${sessionId}"></h2>
</body>

 

[3] 세션 초기화하기 : session.invalidate();

 

[3] 쿠키와 세션 비교

 

 


https://dev-coco.tistory.com/61

https://terianp.tistory.com/57

https://jiwontip.tistory.com/77