[기술정리]쿠키와 세션

송송승현's avatar
Nov 27, 2024
[기술정리]쿠키와 세션

HTTP

  • Http 프로토콜 환경은 connectionless- stateless 한 특성을 가짐
  • 서버는 클라이언트가 누구인지 매번 확인해야하는 과정을 거쳐야함
  • 이 특성을 보완하기 위해 쿠키와 세션을 사용하게 됨

connectionless(비연결성)

  • Http는 TCP/IP 기반
  • TCP/IP는 기본적으로 연결을 종료하지 않으면 유지되는 특성
  • 하나의 서버에 여러개의 클라이언트가 연결되어있을 경우 놀고있는 연결이 많을 가능성이 크고 서버의 자원낭비로 이어짐
  • Http는 각 클라이언트가 서버에 요청을 하고 응답을 받으면 TCP/IP 연결을 끊도록 하는 방식
  • 클라이언트가 요청을 한 후 응답을 받으면 연결을 끊어 버리는 특징을 connectionless

stateless(무상태)

  • 통신이 끝나면 더 이상 상태를 유지하지 않는다.
  • 상태를 유지 하지 않으면 일어나는 문제점
    • 사이트 로그인 - 페이지를 이동할 때마다 매번 로그인
    • 사이트 팝업 끄기 - 페이지를 유지할 때마다 매번 팝업창이 뜨는경우

쿠키(Cookie)

  • 클라이언트 로컬에 저장되는 키와 값이 들어있는 데이터 파일
  • 사용자 인증이 유효한 시간을 명시 할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지
  • 사용자가 따로 요청을 하지 않아도 브라우저가 Request시 RequestHeader를 넣어서 자동으로 전송

세션(Session)

  • 쿠키를 기반으로 하지만 정보 파일를 서버측에서 관리
  • 서버에서는 클라이언트를 구분하기 위해 세션ID를 부여, 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때 까지 인증 상태를 유지
  • 정보를 서버에 두기 때문에 쿠키보다 보안에 장점이 있지만 사용자가 많아질 수록 서버에서 관리하는 메모리의 양이 증가하기 때문에 서버에 과부하를 주게 되므로 성능이 저하될 수 있음
  • 클라이언트가 Request를 보내면, 해당 서버가 클라이언트에게 세션ID를 부여

세션ID

  • 클라이언트와 서버 간의 세션을 식별하는데 사용
  • 클라이언트는 서버에 요청을 보낼 때, 세션ID를 포함한 쿠키를 클라이언트에 전송
  • 이후 클라이언트는 모든 후속 요청에 세션ID 쿠키를 포함하여 서버로 보냄
  • 서버는 세션ID 쿠키를 사용하여 해당 요청이 어떤 세션에 속하는지 식별
  • SESSIONID 쿠키는 브라우저가 닫힐 때까지 또는 명시적으로 만료될 때까지 유지

예제

import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.net.http.HttpResponse; @Controller @RequiredArgsConstructor public class UserController { private final UserService userService; private final HttpSession session; @PostMapping("/login") public String login(UserRequset.LoginDTO loginDTO) { User sessionUser = userService.로그인(loginDTO); session.setAttribute("sessionUser", sessionUser); return "redirect:/"; } }
notion image
 
Share article

송승현의 블로그