Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save taekwon-dev/cc08ac2844f95e596a9b272ebe94bbc3 to your computer and use it in GitHub Desktop.
Save taekwon-dev/cc08ac2844f95e596a9b272ebe94bbc3 to your computer and use it in GitHub Desktop.

[4] How to maintain a user state - HttpSession

Servlet, Servlet Container
How the Servlet Container Handles a request
How the Servlet Container Handles multithreading
How to maintain a user state - HttpSession ◀︎ 현재 글
Servlet Scopes

웹 서비스에서 한 번 로그인(인증)을 하면 일정 기간 동안은 별도의 인증 과정 없이 인증 상태를 요구하는 API 요청을 할 수 있다. (물론, 비밀번호 등 민감한 정보를 다룰 때는 2차 인증을 요구하는 경우가 있을 수 있다.)

UX (유저 경험)면에서도 인증이 요구되는 매 요청 마다 인증을 요구하는 형식보다는 위와 같이 별도의 공간에서 유저의 인증 상태를 저장하고 이를 활용하여 일정 기간 동안은 별도의 인증이 필요 없도록 하는 방식이 유리할 것이다. 그렇다면, 서블릿 컨테이너는 유저의 상태 저장을 어떻게 할까?

image

서블릿 컨테이너는 HttpSession 객체를 생성해서 유저의 상태 정보를 저장할 수 있다. [ 그림 1 ] 처럼 여러 명의 클라이언트가 있고 각각의 상태를 저장할 때는 각각의 HttpSession 객체를 생성한 후 유일한 세션 ID를 통해 여러 클라이언트를 식별 할 수 있도록 한다. (세션 ID를 통해서 특정 세션 객체에 접근할 수 있는 구조)

image

HttpSession 객체를 생성하고 해당 객체에 각 유저에게 할당한 세션 ID를 할당한다. 이렇게 생성된 세션 ID 값은 서블릿 요청 응답 객체에 담아서 다시 클라이언트에 응답한다. [ 그림 2 ] 처럼 서블릿 컨테이너는 클라이언트의 요청이 오면 Request, Response 객체를 생성하고 해당 요청을 처리할 스레드는 이 두 객체를 서블릿의 service() 메소드 호출하면서 파라미터 값으로 전달한다. 앞서 언급한 세션 ID는 Response 객체에 담겨 클라이언트에게 다시 전달된다.

이 글의 서두에서 언급 했던 로그인 상황을 예로 들었을 때, 한 번 로그인 한 뒤 일정 기간 동안은 재로그인 할 필요 없이 인증 상태를 유지할 수 있다. 기간 내에서 유효한 것이다. HttpSession 역시 특정 기간 내 유효하도록 설정할 수 있고, 서블릿 컨테이너 설정 파일에서 해당 설정 값을 관리할 수 있다.

고유값을 쿠키를 통해 반환한 뒤, 요청 시 해당 쿠키 값을 통해 역으로 1번 유저를 식별할 수 있도록 한다. 이 글의 서두에서 언급 한 것 처럼 특정 상태를 저장하는 맥락에서는 기간 개념이 등장한다. HttpSession 특정 기간 내 유효하도록 설정 할 수 있고, 서블릿 컨테이너 설정 파일에서 임의로 기간에 해당 되는 값을 수정할 수 있다.

[web.xml]
<session-config>
	<session-timeout>10	</session-timeout> // 분 단위
</session-config>

HttpSession 이 특정 기간 내에만 유효하다는 말은 HttpSession 객체가 생성 ~ 소멸되는 생명주기와 밀접한 관계를 갖는다. 당연하게도 해당 객체에 특정 유저의 상태가 저장되어 있으므로 소멸된 이후에는 더 이상 활용할 수 없는 것이다. 우리는 이러한 특징을 Scope 개념을 활용해서 Session Scope 로 표현할 수도 있다. 다음 글에서는 이번 서블릿 시리즈의 마지막 주제인 Scope 에 대해서 다룰 예정이다.

유투브 - 개발바닥 (인터뷰 편)
위 링크 클릭하면 이번 HttpSession 주제와 관련한 면접 질문 예시를 확인할 수 있다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment