HTTP 쿠키는 서버가 사용자의 웹 브라우저(클라이언트)에 전송하는 작은 데이터 조각이다.
브라우저는 데이터 조각(쿠키)를 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송한다.
서버에 두 요청이 들어온 경우, 쿠키를 통해 두 요청이 동일한 브라우저에서 등어왔는지 아닌지 판단할 수 있다.
→ 상태(Stateless)가 없는 HTTP 프로토콜에서 상태 정보를 확인 수 있게 해주는 수단이다.
스프링에서 쿠키를 생성 할 때는 new Cookie()
를 통해 만들 수 있다.
이후 response
에 addCookie()
를 해 응답 요청에 쿠키를 넣어주면 된다.
예시 - 로그인 후, 아이디를 쿠키에 넣어 응답요청으로 반환한다.
@PostMapping("/login")
public String loginForm(@Validated @ModelAttribute("loginForm") LoginForm form, BindingResult bindingResult, HttpServletResponse response) {
//...
//로그인 성공 처리
//쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료시 모두 종료)
Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
response.addCookie(idCookie);
return "redirect:/";
}
응답 헤더 확인 - 브라우저의 개발자 모드로 확인
다음과 같이 쿠키에 memberId 가 1 으로 지정 되어 있는 것을 확인 할 수 있다.
이제 브라우저는 서버에 요청을 보낼 때 memberId=1 이라는 쿠키로 서버에 자신의 로그인 정보를 알릴 수 있다. 마치 상태를 갖고 있는 것처럼 요청을 보낼 수 있다.
이후 서버는 요청을 받을 때, 이런 memberId = 1이 라는 쿠키정보를 통해서 해당 요청이 어떤 유저의 요청인지 확인 할 수 있다.
쉽게 말해, 쿠키를 사용하여 로그인 id (memberId=1)을 전달해 로그인을 유지
할 수 있다. 하지만 이런 방식은 보안적으로 심각한 문제가 있다.
⇒ 이런 문제를 해결하기 위해 세션을 이용한다.
서버에 중요한 정보를 따로 보관하고 연결을 유지하는 방법
→ 중요한 정보를 서버에 저장하고, 클라이언트에는 이에 대한 키 값을 쿠키에 넣어 전송하는 방식
💡💡💡💡
세션 Id는 UUID로 생성한다. UUID(범용 고유 식별자 universally unique identifier) 는 중복될 가능성이 거의 없다.UUID.*randomUUID*().toString();
으로 uuid 스트링을 생성할 수 있다.
- UUID 예시
550e8400-e29b-41d4-a716-446655440000
→ 여기서 중요한 포인트는 회원과 관련된 정보는 클라이언트에 직접 전달이 되지 않는다.