HttpSession에서 session key는 하나인데 어떻게 여러 유저를 구분해서 값을 가져올까?

채상엽·2022년 7월 23일
2

Spring

목록 보기
10/21
post-thumbnail

HttpSession을 사용하다가 생긴 의문

HttpSession에서 session key는 하나인데 어떻게 여러 유저를 구분해서 값을 가져올까?

예를 들면 아래와 같다.

@AutoWired
HttpSession session;

@PostMapping("/")
public void create(User user) {
  session.setAttribute("createdUser", user);
}

위와 같이 createdUser 라는 하나의 문자열을 key로 이용하여 Servlet ContainerHttp clientHttp server 간의 세션을 생성한다.

A라는 유저가 세션 값을 저장한다고 하면 createdUser라는 문자열을 key로 이용하여 세션 값을 저장할 것이다. 그렇다면 또 다른 B라는 유저가 있다고 가정하면 어떨까? B라는 유저도 똑같은 createdUser라는 문자열을 key로 이용하여 세션 값을 저장할 것이다.

즉, 이럴 경우 어떻게 사용자마다 구분 된 세션을 가져올 수 있는지에 대한 의문인 것이다.

결론부터 말하자면 Session은 각 클라이언트마다 하나씩 생성되어 제공된다

각 클라이언트의 요청마다 Session은 다르게 생성되기 때문에, 같은 문자열 key를 이용하여 session.getAttribute("createdUser"); 를 호출하더라도, 각 사용자의 정보가 저장된 다른 세션 값이 보이게 되는 것이다.

Session 이란?

서버간의 연결이 지속적으로 유지되는 상태

클라이언트에서 상태 정보를 유지하는 기술은 쿠키(Cookie)라고 한다. 쿠키는 클라이언트 측 또는 사용자의 브라우저에 저장되는 것이다. 반대로 서버에서 상태 정보를 유지하는 기술을 세션(Session)이라고 한다.

즉, 세션은 클라이언트 별로 각각의 상태 정보를 서버에서 저장하는 기술이다. 이는 브라우저가 종료될 때까지 유지 된다.

그렇다면 왜 Session은 각 클라이언트 마다 하나씩 생성되는것일까?

HTTP의 특성과도 관련이 있다. 다음의 HTTP 특성을 보자

HTTP 특성

  • HTTP는 무상태(Stateless) 프로토콜이다.
    • 클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어진다.
    • 클라이언트가 다시 요청하면 이전 요청을 기억하지 못한다.
    • 클라이언트와 서버는 서로 상태를 유지하지 않는다.

그리고 이제 Session의 특성을 알아보자

Session의 특성

  • 클라이언트가 처음 서버에 연결(setAttribute)을 하면 하나의 session id가 생성된다.
    • 이 session id를 통해 서버는 각 사용자의 세션 값을 식별한다.
profile
프로게이머 연습생 출신 주니어 서버 개발자 채상엽입니다.

0개의 댓글