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:/";
}
}

Share article