[SPRING]세션(Session)

Date:     Updated:

카테고리:

태그:

[12] 세션

12.1. 세션 소개

  • 서로 관련된 요청(request)들을 하나로 묶은 것 - 쿠키를 이용
    • browser마다 개별 저장소(session 객체)를 서버에서 제공(1:1)
      (a collection of related HTTP transactions made by one browser to one server)
      • 쿠키: 브라우저에 저장
      • 세션: 서버에 저장
  • 쿠키는 정보를 클라이언트에 저장한 후 네트워크로 주고받기 때문에 민감한 정보를 다루기엔 위험함.
  • 세션은 서버가 직접 관리하므로 민감한 정보를 다루기에 더 적합함.
    • 로그인 정보 유지
  • 클라이언트가 ⓵ 웹 브라우저 통해 서버에 접속한 후 ⓶ 용무를 처리하고 ⓷ 웹 브라우저를 닫아 서버와의 접속 종료하는 하나의 단위를 세션이라함.
  • 세션은 클라이언트가 서버에 접속해 있는 동안 그 상태를 유지하는 것이 목적임.
  • 로그인 ~ 로그아웃까지가 하나의 세션이라고 생각하면 됨.
  • 클라이언트가 처음 접속한 후 웹 브라우저를 닫을 때까지 공유됨.
    • 포워드나 페이지 이동 시에도 세션 영역은 소멸되지 않음.
  • 세션은 브라우저마다 저장됨
    • 같은 PC라도 다른 브라우저라면 다른 세션ID를 저장함.

12.2. 세션 설정, 확인, 삭제

  • 유지 시간 설정
    • 세션은 웹브라우저를 실행할 때마다 새롭게 생성됨.
    • 생성된 세션은 설정된 유지 시간동안 유지됨
      • 유지 시간이 만료되기 전에 새로운 요청이 들어오면 수명이 계속 연장됨.
    • 만료 때까지 클라이언트가 아무런 요청을 하지 않거나 웹브라우저를 닫으면 삭제됨.

    • 방법 2가지
      • web.xml에서 설정
        • 분 단위로 설정함
      • session.setMaxInactiveInterval()
        • 초 단위로 설정함
  • 설정값 확인
    • JSESSIONID
      • 우리가 생성한 적 없음
      • 톰켓 컨테이너에서 새로운 웹 브라우저가 접속하면 세션을 유지하지 위해 자동으로 생성해줌.
      • 이 JSESSIONID는 요청을 보낸 웹 브라우저가 현재 연결되어 있는지(세션이 살아있는지) 확인하는 데 이용됨.
  • 세션 삭제
    • 웹 브라우저를 닫으면 종료됨.
    • 웹브라우저 설정에서 모든 쿠키 삭제해 세션을 삭제하는 방법도 있음.

12.3. 동작 방식

  • 웹 브라우저가 처음 접속하면 서버(톰켓)는 세션을 새로 생성함. 응답 시 세션 아이디를 값으로 갖는 JSESSIONID 쿠키를 응답 헤더(response header)에 담아 웹 브라우저에 보냄.
  • 웹 브라우저는 재요청 시마다 JSESSIONID를 요청 헤더(request header)에 추가하여 보냄.
  • 서버는 요청 헤더에 포함된 JSESSIONID로 해당 요청이 기존 세션에서 이어진 것임을 알게 됨.

12.4. 세션

  • 같은 세션ID를 사용한다는 것은 같은 세션저장소(세션 객체)를 사용할수 있는 것임.
  • 처리과정
    • 클라이언트가 요청을 하면 서버가 세션ID(JSESSIONID)를 쿠키에 담아서 응답함
      • 브라우저로 요청하면 서버는 세션(저장소)을 무조건 생성함.
      • 세션 객체마다 갖고 있는 것은 세션ID임.
    • 그 다음 요청부터는 앞서 응답된 쿠키가 자동으로 따라감
    • 두번째 요청부터 같은 세션임. 쿠키로 서버에 계속 같이 전송됨.
      • 요청에 세션이 꼬리표로 붙어서 가는 것임(구별이 됨)
    • 원래 각 요청이 독립적임.(서로 관련이 없다는 의미)
    • 여기에 쿠키를 이용해서 세션ID를 발급해서 이 요청들에 공통점이 있게됨. (그룹화)
  • 프로그램에서 세션 객체를 사용할수 있음.
    • 세션 끝내는 방법
      • 수동종료
        • invalidate()
          • 세션 객체 제거 (즉시 종료)
          • 로그아웃
      • 자동종료
        • timeout
          • 요청과 요청 사이의 시간이 30분이 넘으면 클라이언트 요청시 서버는 새로운 세션Id를 응답헤더에 담아 응답함.
          • 새로운 새션Id가 발급된다는 것은 새로운 세션 객체가 만들어짐을 뜻함.
          • 기존 세션 객체는 삭제됨.
          • timeout 동안은 서버에 세션 객체가 남아있어야 하므로 서버 부담이 큼.
            • 세션 객체는 삭제처리 된다 하더라도 서버에 오랫동안 남아있을수도 있음.
      • 세션이 끝나고나면 새로운 세션ID가 발급됨.
        • 그 다음부터는 새로운 세션이 시작됨.
    • 세션 객체 얻기
      • request.getSession();
        • javax.servlet.http.HttpSession 타입
        • HTTP session을 구현한 객체. 세션 정보 저장에 사용
    • 세션 객체에 데이터 저장
      • session.setAttribute(“id”, “name”);
    • 세션 ID를 반환
      • String geiId()
    • 세션 내에서 최근 요청을 받은 시간 반환
      • long getLastAccessedTime()
    • 새로 생성된 세션인지를 반환
      • boolean isNew()
        • request.getSession() 호출 후 사용
    • 지정된 시간(초)후에 세션을 종료 (예약 종료)
      • void setMaxInactiveInterval(int interval)
    • 예약된 세션 종료 시간 반환
      • int getMaxInactiveInterval()

12.5. 쿠키 vs 세션

쿠키(Cookie) 세션(HttpSession)
브라우저 저장 서버에 저장
서버 부담 X 서버 부담 O
보안에 불리 보안에 유리
서버다중화에 유리 서버 다중화에 불리

SPRING 카테고리 내 다른 글 보러가기

댓글 남기기