[자바] 세션의 작동 원리

1. 세션의 개념과 특징

세션 개념

컴퓨터, 특히 웹 애플리케이션에서는 이를 "세션 제어"라고 합니다. Session 개체는 특정 사용자 세션에 필요한 속성 및 구성 정보를 저장합니다. 직설적으로 말하면 세션은 서버측을 유지할 수 있는 데이터 저장 기술이다.

세션은 주로 다음과 같은 특징을 가지고 있습니다.

  1. 세션이 저장되는 위치는 서버 측입니다.

  2. 일반적으로 세션은 쿠키와 함께 사용되며, 사용자의 브라우저가 쿠키를 비활성화한 경우에는 URL 재작성을 통해서만 세션 저장 기능을 구현할 수 있습니다.

  3. 단순히 세션을 사용하여 사용자 응답 정보를 저장하는 경우 사용자 수가 많을 경우 세션 파일 수가 많아지고 세션 쿼리가 느려지는 문제가 발생합니다.

기본적으로 세션 기술은 데이터베이스와 다른 백엔드 기반의 임시 저장 기술입니다.

2. 세션을 사용하는 이유

현재 우리가 사용하는 인터넷 애플리케이션 계층 프로토콜은 기본적으로 HTTP와 HTTPS를 기반으로 하며 상태 비저장(Stateless)이며 요청과 응답만 담당합니다. 내가 필요한 것을 서버에 말하면 서버는 그에 상응하는 리소스를 나에게 반환합니다. 추가 처리 없이 서버는 귀하가 누구인지 알 수 없으며 귀하가 누구인지 기반으로 귀하와 관련된 콘텐츠를 표시합니다. 원래 HTTP 프로토콜이 이렇게 설계된 데에는 몇 가지 역사적 이유가 있는데, 당시 인터넷은 주로 학술 교류에 사용되었고 기사 정보 표시 등의 용도로만 사용되었으며 지금보다 훨씬 덜 화려했습니다. 따라서 그 당시의 배경에서 HTTP 프로토콜은 이와 같이 설계되었으며 실제로는 해당 시나리오와 매우 일치합니다. 그러나 인터넷이 점점 더 널리 사용됨에 따라 점점 더 많은 응용 프로그램 형태가 있습니다.당사의 웹 응용 프로그램은 단순한 정보 표시에만 국한되지 않고 사용자가 로그인하고, 포럼에 게시하고, 쇼핑 웹사이트에서 구매합니다. 이를 위해서는 사용자의 상태를 기록할 수 있는 HTTP 프로토콜이 필요합니다. 이것이 지금 우리에게 친숙한 Session의 유래입니다.

3. 세션의 작동 원리

  1. 사용자가 처음으로 서버를 요청하면 서버는 세션 ID를 생성합니다.
  2. 서버는 생성된 세션 ID를 set-cookie를 통해 클라이언트에 반환합니다.
  3. 클라이언트가 sessionid를 받으면 이를 쿠키에 저장하고, 클라이언트가 서버를 다시 방문할 때 이 sessionid를 가져옵니다.
  4. 서버는 클라이언트로부터 다시 요청을 받으면 먼저 해당 sessionid가 있는지 확인하고, 없으면 새로운 sessionid를 생성한 후 1, 2단계 과정을 반복하고, 있으면 세션 파일을 순회합니다. 서버에서 sessionid 파일에 해당하는 sessionid를 찾으면 파일의 키 값은 sessionid이고 값은 현재 사용자에 대한 일부 정보입니다.
  5. 후속 요청에서는 이 세션 ID를 상태 저장 세션으로 교환합니다.

4, 세션 수명주기

세션은 언제부터 적용되나요?

Session은 사용자가 서버에 처음 접속할 때 생성되며, JSP, Servlet, 기타 프로그램에 접속할 때만 Session이 생성되며, HTML, IMAGE 등의 정적 자원에 접속하는 경우에만 Session이 생성되지 않습니다. request.getSession(true)을 호출하여 강제로 세션을 생성할 수 있습니다.

세션은 언제 만료되나요?

  1. 서버는 오랫동안 비활성 상태였던 Session을 서버 메모리에서 지워서 해당 Session이 무효화됩니다. Tomcat에서 세션의 기본 만료 시간은 20분입니다. 세션이 비활성화된 시간부터 계산되며, 세션이 항상 활성화되어 있으면 세션이 만료되지 않습니다. 타이밍은 세션에 액세스하지 않을 때 시작되며, 세션에 액세스하면 타이밍이 0으로 지워집니다.

  2. 세션의 무효화 메소드 호출

    HttpSession session = request.getSession();
    session.invalidate();//注销该request的所有session
    
  3. 세션 만료 시간 설정

  • web.xml

    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>
    
  • 프로그램에서 수동으로 설정

    session.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期
    
    request.getSession().setMaxInactiveInterval(-1);//永不过期
    
  • Tomcat은 세션 만료 시간을 수정할 수도 있습니다. server.xml에서 컨텍스트를 정의할 때 다음 정의를 사용하세요.

    <Context path="/livsorder" 
    docBase="/home/httpd/html/livsorder"   defaultSessionTimeOut="3600" 
    isWARExpanded="true"   
    isWARValidated="false" isInvokerEnabled="true"   isWorkDirPersistent="false"/>
    
  • 4. 브라우저를 닫으면 세션이 무효화됩니다.

다섯째, 세션 성능 병목 현상

우리가 이야기하고 싶은 또 다른 것은 세션 데이터의 저장입니다. 일반적으로 대부분의 웹 프레임워크는 명시적으로 설정하지 않으면 세션 데이터를 메모리에 저장합니다. 웹 애플리케이션의 사용자 수가 적은 경우에는 문제가 되지 않습니다. 그러나 사용자 수가 비교적 많으면 한 가지 일이 발생할 수 있습니다. 즉, 메모리가 충분하지 않습니다. 이것은 정상적인 현상입니다. 메모리 용량은 매우 소중합니다. 각 사용자의 세션 데이터가 100K라고 가정하면 10,000명의 사용자가 약 1G의 저장 공간을 차지하게 됩니다. 세션 데이터 정리 메커니즘도 느려지면 메모리를 사용하기가 매우 쉽습니다. 이를 위해서는 세션을 하드 디스크 파일 시스템이나 데이터베이스에 저장하는 등 상대적으로 동시성이 큰 사이트를 설계할 때 세션의 저장 방법을 고려해야 합니다. 따라서 웹 애플리케이션을 개발할 때 사용자 수가 많다면 이 점을 염두에 두어야 합니다. 또한 Session을 메모리에 두는 것에는 또 다른 단점이 있는데, 웹 서버를 다시 시작하면 모든 Session 상태가 변경되어 사용자 경험에 어느 정도 영향을 미치게 됩니다.

여섯째, 세션은 로그인 상태 제어를 실현합니다.

서버에 요청할 때 처음으로 신원을 확인하기 위해 브라우저가 사용자 이름과 비밀번호를 입력해야 한다고 가정하면, 서버는 사용자 이름과 비밀번호를 받아 데이터베이스에서 비교합니다. 이 세션은 합법적인 사용자이므로 "이미"로 표시되어야 하며, "인증됨" 또는 "로그인됨" 등으로 표시되어야 하며, 세션의 상태이므로 자연스럽게 세션 객체에 저장됩니다. 세션 객체에서 로그인 상태를 아래와 같이 확인하고, 사용자가 다시 방문하면 Tomcat은 세션 객체에서 로그인 상태를 확인합니다.

여기에 이미지 설명을 삽입하세요.

보호된 자원이 요청될 때마다 세션 객체의 로그인 상태를 확인하며 isLogin=true인 세션에만 접근할 수 있으며 이에 따라 로그인 메커니즘이 구현됩니다.

추천

출처blog.csdn.net/u011397981/article/details/132787404