HTTP 프로토콜은 stateless이다.
즉, 서버가 웹 브라우저의 요청에 대해 응답하고나면 해당 클라이언트와의 연결을 지속하지 않으므로, 서버는 클라이언트의 이전 정보를 가지고 있지 않는다.
서버가 클라이언트의 정보를 다음 요청에도 재사용하기 위해 쿠키, 세션 기술을 이용한다.
Set-Cookie:
라는 문자열이 있으면, 사용자 로컬 디스크에 쿠키 형태로 저장한다. Set-Cookie:SESSIONID=...
// 아래의 reqeust, response는 각각 HttpServletRequest, HttpServletResponse의 객체가 저장된 변수이다.
// 생성
Cookie cookie = new Cookie("key", value);
response.addCookie(cookie);
// 클라이언트가 보낸 쿠키 정보 읽기
Cookie[] cookies = request.getCookies(); // 한꺼번에 읽기
Cookie cookie = Optional.ofNullable(request.getCookies())
.flatMap(cookies -> Arrays.stream(cookies)
.filter(c -> c.getName.equlas(name))
.findFirst())
.orElse(null);
// 클라이언트에게 쿠키 삭제 요청 (쿠키를 직접적으로 삭제하는 명령어는 없다.)
Cookie cookie = new Cookie("key", null);
cookie.setMaxAge(0);
response.addCookie(cookie); // 사전에 전송한 쿠키를 재전송하면 재전송한 값으로 업데이트된다.
Stateless http 프로토콜상에서 일정 시간동안 같은 사용자로부터의 여러 요청을 동일한 사용자 접속 세션으로 인식시키는 기술이다.
// 아래의 reqeust는 사용자의 요청에 대응하는 HttpServletRequest 객체가 저장된 변수이다.
// getSession(true) 서버에 생성된 세션이 없으면, 새롭게 생성하여 반환한다. (default)
// getSession(false) 서버에 생성된 세션이 없으면, null을 반환한다.
HttpSession session = request.getSession();
// 새로 생성된 세션인지 확인한다.
session.isNew();
// 세션 값을 저장한다.
session.setAttribute(String name, Object value);
// 세션 값을 읽어온다.
session.getAttribute(String name);
// 세션을 삭제한다.
session.removeAttribute(String name); // 특정 세션 값만 삭제한다, 세션이 종료되지는 않는다.
session.invalidate(); // 모든 세션 값을 삭제하고, 세션을 종료한다.
Reference
- TCP/IP 쉽게, 더 쉽게
cookie 와 session을 명확하게 설명해주셔서 잘 정리가 되었습니다. 감사합니다 : )