Java 웹 애플리케이션의 세션 관리

HTTP는 상태를 유지하지 않습니다(stateless). 이는 현대적인 웹 애플리케이션에 있어 문제입니다.

서버는 사용자를 기억하지 못합니다. 모든 요청은 새로운 요청입니다. 사용자를 추적할 방법이 없다면, 장바구니는 사라지고 사용자는 클릭할 때마다 매번 다시 로그인해야 합니다.

세션 관리가 이 문제를 해결합니다. 세션 관리는 요청 간의 연결 고리를 만들어 서버가 사용자가 누구인지 알 수 있게 합니다.

작동 방식:

  • 로그인을 합니다.
  • 서버가 세션을 생성합니다.
  • 서버가 고유한 세션 ID(Session ID)를 생성합니다.
  • 서버가 이 ID를 브라우저로 보냅니다.
  • 브라우저가 매번 새로운 요청을 보낼 때마다 이 ID를 다시 보냅니다.

Java 개발자는 이를 관리하기 위해 HttpSession 인터페이스를 사용합니다. ID나 역할(role)과 같은 사용자 데이터를 세션에 직접 저장할 수 있습니다.

세션을 추적하는 일반적인 방법:

  • 쿠키(Cookies): 가장 일반적인 방법입니다. 브라우저가 ID를 자동으로 처리합니다.
  • URL 리라이팅(URL Rewriting): 사용자가 쿠키를 비활성화한 경우 유용합니다.
  • 숨겨진 폼 필드(Hidden Form Fields): 여러 단계로 이루어진 양식(form)에 적합합니다.

보안이 가장 큰 관심사입니다. 공격자는 사용자를 사칭하기 위해 세션 ID를 탈취하려고 시도합니다.

다음 단계들을 통해 애플리케이션을 보호하세요:

  • 모든 트래픽에 HTTPS를 사용하세요.
  • JavaScript가 쿠키를 훔칠 수 없도록 쿠키를 HttpOnly로 설정하세요.
  • 쿠키가 암호화된 연결을 통해서만 전송되도록 Secure 플래그를 사용하세요.
  • CSRF 공격을 방지하기 위해 SameSite=Strict를 사용하세요.
  • 로그아웃 시 항상 session.invalidate()를 호출하세요.

대규모 엔터프라이즈 애플리케이션의 경우 서버 한 대로는 부족합니다. 서버가 여러 대라면, 서버 B는 서버 A에서 생성된 세션에 대해 알지 못합니다.

이를 해결하려면 분산 세션 관리를 사용하세요:

  • 스티키 세션(Sticky Sessions): 로드 밸런서가 매번 사용자를 동일한 서버로 보냅니다.
  • 데이터베이스 저장(Database Storage): 모든 서버가 하나의 중앙 데이터베이스를 확인합니다.
  • Redis: 업계 표준입니다. 빠르고 확장이 용이합니다.

세션(Session)과 JWT의 차이점도 알아두어야 합니다. 세션은 서버에 데이터를 저장하고, JWT는 클라이언트에 데이터를 저장합니다. 세션은 제어가 더 쉽고, JWT는 마이크로서비스(microservices)에 더 적합합니다.

이러한 개념을 숙달하면 안전하고 확장 가능한 소프트웨어를 구축하는 데 도움이 됩니다.

출처: https://dev.to/naveenkumar1/session-management-in-java-web-applications-38od