[자바JAVA/JSP] 세션(Session)

세션 session

세션이 없는 http 프로토콜의 요청처리흐름 아래와 같다.

세션기능이 적용안된 http 프로토콜의 요청처리흐름

세션을 이해하기 위해서는 http 프로토콜의 특성을 알아둬야한다.
http프로토콜의 특성은 연결되면 요청/응답을 한 뒤에 바로 연결이 종료된다.
클라이언트와 서버의 연결 정보를 유지하기위해 연결이 끊어지지않도록 유지할 수 있게 하는 것이 세션이다.
즉 세션은 클라이언트와 서버 간의 접속을 유지시켜주는 역할을 한다.

  • 세션 : 서버쪽에서 웹컨테이너의 상태를 유지하기 위해서 정보를 저장하는 객체(방법)
    웹브라우저당 1개의 세션 정보를 생성해서 사용한다.
    웹 서버는 각각의 브라우저로 부터 요청을 받아서 응답할때 특별한 식별자(seessionID)를 가지고 응답한다.

세션기능이 적용된 http 프로토콜의 요청처리흐름

위와 같은 이미지를 시퀀스 다이어그램이라고 부른다




세션 사용방법 : 세션 객체 생성(JSP내장객체) -> 값을 저장 -> 저장된 값을 확인

기본적으로 객체는 객체생성해서 사용해야하지만 세션은 JSP에서 내장함수이다.




세션생성

세션영역에 해당 속성을 저장하는 것이 세션 객체이다.
세션정보를 생성하는 코드이다

1
session.setAttribute("이름", 값);




세션정보 가져오기

세션 영역에 있는 속성값을 가져오는 코드이다.

1
session.getAttribute("이름")




세션정보 삭제하기

세션정보를 삭제하는 코드이다.
해당 코드는 특성 대상값을 삭제한다.

1
session.removeAttribute("이름")




세션유지시간 설정하고 반환하기

세션의 유지 시간을 설정하는데 사용되는 코드이다. 초 단위로 인자 값을 설정할 수 있다.

1
session.setMaxInactiveInterval(1000);

아래 코드는 세션의 유지 시간을 반환하는 역할을 한다.

1
session.getMaxInactiveInterval();




세션정보 초기화하기

이 코드는 세션의 모든 속성을 제거하는 역할을 한다.

1
sesssion.invalidate();




삭제와 초기화의 차이

** invalidate와 removeAttribute의 차이 **

invalidate() 메소드는 세션의 모든 속성 값을 제거하기 떄문에 removeAttribute()메소드를 사용할 때 처럼 각 속성 값들을 하나씩 제거할 필요가 없다.
invalidate() 메소드는 모든 속성을 제거하기 때문에 세션 유지 시간이 지났을 때 세션이 초기화되는 것과 같은 효과를 가져온다.

초기화가 되지않는다면 서버입장에서는 세션정보를 계속 가지고있게되어 부담이 되고 또한 보안상의 문제가 있다.
따라서 일반적으로 삭제보다는 초기화를 많이 사용한다.
주로 로그아웃기능시 사용한다.




세션값 테스트

기존 사용하던 브라우저 다 종료한 후 실행해야 정확히 세션테스트를 할 수 있다.

  • 브라우저당 세션 1개이므로 크롬에서 세션을 생성했다고 익스엣지에 똑같은 세션이 생성되어있지않다.

이제 세션값 생성버튼을 누르면 세션을 생성하고 세션값 삭제버튼을 누르면 세션값이 삭제되며 세션값 초기화를 누리면 세션값이 초기화되는 기능을 구현해보자

  1. sessionTest.jsp 페이지생성
1
2
3
4
5
6
7
8
9
10
11
12
13
<%
String value = (String)session.getAttribute("value");
//session.getAttribute()는 object테이터타입이기에 명시적형변환으로 (String)을 해줘야한다.
if ( value == null){
value = "세션값 없음!"; // 기본 반환타입인 null에서 세션값 없음으로 표현변경
}
%>

<h1>세션 값 : <%= value %></h1>
<h1>세션 값(이름) : <%= session.getAttribute("name") %></h1>
<input type="button" value="세션값 생성" onclick="location.href='sessionSet.jsp'">
<input type="button" value="세션값 삭제" onclick="location.href='sessionDel.jsp'">
<input type="button" value="세션값 초기화" onclick="location.href='sessionInvalidate.jsp'">
  1. sessionSet.jsp 페이지생성
    세션은 여러개 생성가능하다
    여기서는 value와 name 총 2개의 세션을 만들었다.
1
2
3
4
5
6
7
8
9
<%
//세션 값 생성
session.setAttribute("value", "세션값 있음~");
session.setAttribute("name", "홍길동");
%>

<script>
alert("세션값 생성 완료!")
location.href="sessionTest.jsp"

위는 자바스크립트코드를 사용했고 response객체사용를 사용할 수 있다.

1
2
3
4
5
6
<%
//세션 값 생성
session.setAttribute("value", "세션값 있음~");
session.setAttribute("name", "홍길동");
response.sendRedirect("sessionTest.jsp");
%>
  1. sessionDel.jsp 페이지생성
    sessionSet과 마찬가지로 처리하는 데에 2가지 방법이 있다.
    자바스크립트를 사용하거나 response를 사용하거나이다. 이 둘의 차이점은 전혀없다.
    편한거 사용하면 된다.

  2. 자바스크립트 코드사용

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <%
    //세션 값 삭제
    session.removeAttribute("value");
    %>

    <script>
    alert("세션값 삭제 완료!")
    location.href="sessionTest.jsp"
    </script>
  3. response객체사용

1
2
3
4
<%
session.removeAttribute("value");
response.sendRedirect("sessionTest.jsp");
%>
  1. sessionInvalidate 페이지생성
    세션에 있는 모든 정보를 없앨수있다.

처리시 2가지 방법이있다.
자바스크립트를 사용하거나 response를 사용하거나이다. 이 둘의 차이점은 전혀없다.
편한거 사용하면 된다.

  1. 자바스크립트코드사용
1
2
3
4
5
6
<%session.invalidate();%>

<script>
alert("세션값 초기화 완료!")
location.href="sessionTest.jsp";
</script>
  1. response객체사용
1
2
3
4
<%
session.invalidate();
response.sendRedirect("sessionTest.jsp");
%>

기존 브라우저를 다 종료 후 sessionTest를 열면 세션값은 null인 것을 확인할 수 있다.
세션값 생성 버튼을 클릭하면 sessionSet페이지로 이동 후 alert창이 뜨고 다시 sessionTest로 돌아오게된다.
그러면 화면에는 세션값 있음~홍길동이 출력된다!

이제 세션값 삭제 버튼을 눌러보면 모든 값이 다 사라져야하지만
세션값 없음!홍길동이 출력된다. 세션값을 삭제했지만 null이 아닌 여전히 홍길동이 계속 출력된다.

이럴때 세션값 초기화 버튼을 사용하면 세션값 없음!null이 출력된다
초기화버튼을 통해 모든 세션의 정보를 지울 수 있다.