728x90

오늘 배운 것: 서버는 세션 정보를 가지고 있지만 세션id가 없다면 어떤 세션인지 식별할 수 없다. 클라이언트에서 쿠키에 저장한 세션id를 받아서 서버에서 찾아서 응답해주는 로직을 안하고 서버에서 세션값을 가져오려다가 알게 되었다~~ 로그인한 세션은 덮어씌워지고 브라우저에서 하나만 가지고 있다고 생각해서 발생한 문제였다. 그렇다면 세션은 몇개까지 서버에서 저장할 수 있는거지? 저장한 세션을 모두 조회해볼 수도 있겠다

 

애매한 이해 정리,,

 

덮어씌워짐?:
  • "덮어씌워진다"는 표현은 같은 브라우저에서 새 로그인 요청이 있을 때 기존 세션 데이터가 갱신되는 걸 의미할 수 있습니다.
  • 하지만 세션이 새로 생성되어 덮어씌워지는 건 아님. 기존 JSESSIONID에 연결된 세션 객체가 유지되고, 속성(setAttribute)만 업데이트됩니다.

 

정확한 표현:

  • "같은 브라우저에서 하나의 JSESSIONID를 유지하며, 로그인 시 세션 속성이 업데이트된다."

 

 

그러면 나는 다른 컨트롤러 단에서 HttpSession 객체를 파라미터로 넣었더니 세션 객체가 생성되어서 해당 세션에는 속성값을 등록하지 않아서 null이 나왔던 것.

원래있던 세션은?

 

  1. 원래 세션은 서버에 그대로 유지됨:
    • 서버는 세션을 메모리(또는 Redis 같은 저장소)에 저장하고, 클라이언트가 새 세션을 생성해도 기존 세션은 삭제되거나 즉시 영향을 받지 않습니다.
    • 예:
      • 로그인 후: JSESSIONID=abc123, USER=alice.
      • 새 세션 생성: JSESSIONID=xyz789, USER=null.
      • 서버 메모리: 
      • text
        CollapseWrapCopy
        abc123: {USER: "alice"} xyz789: {}
    • 원래 세션(abc123)은 여전히 서버에 존재.
  2. 클라이언트와의 연결이 끊어짐:
    • 클라이언트가 새 JSESSIONID(예: xyz789)를 쿠키로 사용하면, 이후 요청은 새 세션에만 연결됩니다.
    • 원래 세션(abc123)은 클라이언트가 더 이상 참조하지 않으므로 "활성 상태"에서 제외됨.
  3. 원래 세션의 운명:
    • 타임아웃까지 유지: 세션은 설정된 타임아웃(기본 30분, server.servlet.session.timeout) 동안 살아있습니다.
    • 만료 후 삭제: 타임아웃이 지나면 서버가 자동으로 세션을 정리(Garbage Collection 또는 세션 저장소에서 제거).
    • 즉시 무효화: 서버 코드에서 session.invalidate()를 호출하면 즉시 삭제됨.

 

 

728x90

+ Recent posts