서블릿 HTTP 세션

서블릿도 우리가 직접 만든 SessionManager와 같은 방식의 HTTP 세션을 제공한다.

Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05

서블릿으로 HttpSession을 생성하면 JSESSIONID라는 이름의 쿠키를 생성하고 추정 불가능한 랜덤 값을 값으로 가진다.

HttpSession

생성 및 조회

// 상수만 가져다 쓰기 때문에 객체를 만들지 못하게 abstract나 interface로 만든다.
public abstract class SessionConst {
    public static final String LOGIN_MEMBER = "loginMember";
}
  • 세션 생성

    • request.getSession(true)

      • 기본값이 true이므로 생략할 수 있다.

      • 세션이 있으면 기존 세션을 반환한다.

      • 없으면 새로 생성해서 반환한다.

    • request.getSession(false)

      • 세션이 있으면 기존 세션을 반환한다.

      • 없으면 생성하지 않고 null을 반환한다.

데이터 저장

session.setAttribute()로 하나의 세션에 여러 값을 저장할 수 있다.

JSESSIONID를 확인할 수 있다.

@SessionAttribute

getAttribute()를 일일이 하지 않아도 알아서 데이터를 처리해준다.

TrackingModes

로그인을 처음 시도하면 url에 jsessionid가 붙는다.

  • 웹 브라우저가 쿠키를 지원하지 않을 때 url로 세션을 유지하는 방법

  • url에 값을 계속 포함해서 전달해야 한다.

    • 번거로운 작업이라 거의 사용하지 않는다.

  • 서버 입장에서는 쿠키 지원 여부를 최초에 판단하지 못하기 때문에 쿠키와 url의 jsessionid 모두 전달한다.

이렇게 설정하면 url에 더 이상 노출되지 않는다.

세션 정보

  • sessionId

    • 세션 ID, JSESSIONID의 값

    • ex. 34B14F008AA3527C9F8ED620EFD7A4E1

  • maxInactiveInterval

    • 세션의 유효 시간

    • ex. 1800초, 30분

  • creationTime

    • 세션 생성 일시

  • lastAccessedTime

    • 세션과 연결된 사용자가 최근에 서버에 접근한 시간

    • 클라이언트에서 서버로 sessionId(JSESSIONID)를 요청한 경우 갱신된다.

  • isNew

    • 새로 생성된 세션인지 과거에 만들어져 클라이언트에서 서버로 sessionId(JSESSIONID)를 요청해서 조회된 세션인지 여부

타임아웃

  • 세션은 사용자가 로그아웃을 직접 호출해서 session.invalidate()이 호출되는 경우에 삭제된다.

  • 대부분의 사용자는 로그아웃 대신 웹 브라우저를 종료한다.

    • HTTP는 비연결성이기 때문에 서버는 사용자가 웹 브라우저를 종료했는지 알 수 없다.

    • 따라서 서버에서 언제 세션 데이터를 삭제해야 하는지 판단하기 어렵다.

이 경우 남아있는 세션을 계속 보관하면 문제가 발생할 수 있다.

  • 세션과 관련된 쿠키(JSESSIONID)를 탈취 당하면 시간이 지나도 이 쿠키로 악의적인 요청을 보낼 수 있다.

  • 세션은 기본적으로 메모리에 생성되기 때문에 OOM이 발생할 수도 있다.

    • 10만명이 로그인하면 세션도 10만개 생긴다.

종료 시점

  • 세션 생성 시점을 기준으로 제한 시간을 잡으면 사이트를 이용하면서 30분마다 로그인 해야한다.

    • 제일 최근에 서버에 요청한 시간을 기준으로 시간을 유지하면 된다.

설정

  • 기본값은 30분(1800초)

  • 글로벌로 설정할 때는 60분, 120분 처럼 분 단위로 설정하는 게 좋다.

  • 60초보다 작은 값은 설정할 수 없다.

  • 특정 세션의 시간을 설정한다면 setMaxInactiveInterval()을 이용한다.

타임아웃 발생

  • 해당 세션에 JSESSIONID를 전달하는 HTTP 요청이 있으면 현재 시간으로 다시 초기화 한다.

    • 설정한 시간만큼 세션을 추가로 사용할 수 있다.

  • LastAccessedTime으로부터 timeout 만큼의 시간이 지나면 WAS가 세션을 제거한다.

정리

서블릿의 HttpSession의 타임아웃 기능 덕분에 세션을 안전하고 편리하게 사용할 수 있다.

  • 실무에서는 세션에 최소한의 데이터만 보관해야 한다.

    • 보관한 데이터 용량 * 사용자 수로 세션의 메모리 사용량이 급격하게 늘어나 장애로 번질 수 있다.

  • 세션 시간을 너무 길게 가져가면 메모리 사용이 누적되므로 적당한 시간을 선택한다.

    • 기본이 30분이니 이걸 기준으로 고민한다.

Last updated

Was this helpful?