티스토리 뷰

세션(Session)이란?

 

  • 세션의 정보는 접속해서 종료되기까지 유지된다.
  • 접속시간에 제한을 두어 일정시간 응답이 없으면 유지를 못하게 설정이 가능하다.
  • 쿠키보다 보안적으로 유리하다.
  • 웹 컨테이너에 정보를 보관한다
  • 웹 브라우저마다  별도의 세션을 갖는다.(세션 고유ID 할당)

 

세션과 쿠키의 차이점

- 쿠키웹 브라우저에 정보를 관할 때 사용한다. 반면 세션웹 컨테이너에 정보를 보관한다.

- 세션은 웹 브라우저가 아니라 서버에 값을 저장한다.

- 서버는 세션을 사용해서 클라이언트 상태를 유지할 수 있기 때문에, 로그인한 사용자 정보를 유지하기 위한 목적으로 세션을 사용한다.

- 서버에 저장하여 보안성이 뛰어나기 때문에 쿠키보다 세션을 사용한다. 

 

HTTP 프로토콜의 특성

세션을 이해하기 위해서는 HTTP프로토콜의 특성을 알아두면 많은 도움이 된다. HTTP란 웹에서 텍스트,이미지, 사운드 등의 파일들을 주고받기 위한 통신 규약이다.

HTTP프로토콜은 데이터를 요청하고 데이터의 결과 값을 받게 되면 바로 연결은 종료된다. 일반적으로 항상 연결된 상태에서 데이터를 주고받는다고 생각할 수도 있다. 하지만 HTTP프로토콜은 데이터 송/수신을 하자마자 바로 연결이 끊기게 된다. 이것이 HTTP프로토콜의 기본적인 특성이다.

 

세션 기능이 적용되지 않은 HTTP 프로토콜의 요청 처리 흐름

 

 

세션의 개요

클라이언트와 서버의 연결정보를 유지하려면 연결이 끊어지지 않고 유지되어야 하므로 세션이라는 기능이 필요하다.

클라이언트가 세션에 요청할 경우 서버측에서는 클라이언트에게 클라이언트를 구분할 수 있는 식별자(Session ID)를 부여하게 된다. 여러 클라이언트가 요청하는 정보들은 이 Session ID를 통하여  클라이언트를 구분하여 정보를 저장할 수 있는 것이다.

 

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

JSP 세션 생성

예시

session.setAttribute("key", "value");
String value = (String)session.getAttrubute("key");

 세션도 쿠키와 마찬가지로 key-value의 형태로 저장이 되고 setAttribute와 getAttribute 메서드를 이용해 값을 저장하고 얻을 수 있습니다.

HttpSession session = request.getSession();

 세션을 생성하는 또 다른 방법으로 request객체를 이용하는 방법이 있습니다. getSession 메서드는 현재 사용되고 있는 세션이 있으면 그 세션을 반환하고 없으면 새로운 세션을 생성해 반환합니다.

 

 

JSP에서의 세션 관리

1.3.1 session 객체의 메소드

 

세션 객체에서 자주 이용되는 메소드를 알아보자.

 

①setAttribute

session.setAttribute("name","hongkildong");

 

이 코드는 세션 객체에 hongkildong이라는 값이 들어있는 name이라는 속성을 저장하는 역할을 한다. 세션은 유지 시간을 초과하지 않는 한 브라우저를 종료하지 않게 되면 name 속성은 계속해서 잃지 않고 유지할 수 있다. 현재 저장한 속성은 hongkildong이라는 String값이지만, 저장 속성 형태는 객체 타입은 모두 저장할 수 있다.

String name = (String)session.getAttribute("name");

위 코드는 세션 객체에서 name 속성을 얻어오는 역할을 한다. setAttribute할 때 String형태로 값을 입력했기 때문에 받을 떄에도 String 형태로 선언한 name 변수에 대입한다. getAttribute의 인자는 하나뿐이며 그 인자 값은 속성명을 의미한다. getAttribute의 기본적인 반환 값의 타입은 Object이므로, String 타입의 변수에 값을 할당하려면 String 형태로 형변환을 해주어야 한다. 예를 들어 Student 클래스가 들어있는 것을 반환할 경우는 Student student = (Student)session.getAttribute("student");와 같이 적절하게 형 변환을 해주어야 한다.

 

②removeAttribute

session.removeAttribute("name");

이 코드는 파라미터로 지정된 이름의 속성 값을 제거할 때 사용된다. 세션에 저장해둔 속성을 이미 모두 사용하였고 더 이상 사요할 필요가 없을 때 제거하게 된다.

 

③setMaxInactiveInterval

session.setMaxInactiveInterval(1000);

 

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

 

④getMaxInactiveInterval

session.getMaxInactiveInterval();

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

 

⑤invalidate()

sesssion.invalidate();

 

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

 

JSP 세션 종료

예시

session.invalidate();

 세션을 유지할 필요가 없을 경우 invalidate 메서드를 사용하면 세션의 모든 정보가 삭제됩니다. 이 기능은 사용자가 로그아웃을 할 때 이용되는 기능입니다.

 

 

 

 

JSP 세션 관련 메서드

 아래는 세션에 관한 정보를 얻을 수 있는 메서드들입니다.

메서드 명  리턴 타입 설명
getId() String 세션의 고유 ID를 반환합니다.
getCreationTime() long 세션이 생성되었던 시간을 반환합니다
getLastAccessedTime() long 웹 브라우저가 가장 마지막에 세션에 접근한 시간을 반환합니다.

 

세션을 활용한 로그인 관리

1.로그인에 성공하면 session 기본 객체의 특정 속성에 데이터를 기록한다.

2.이후로 session 기본 객체의 특정 속성이 존재하면 로그인한 것으로 간주한다.

3.로그아웃할 경우 session.invalidate()메서드를 호출하여 세션을 종료한다.

 

 

!! 세션에 여러 속성을 사용해서 연관 정보들을 저장할 때 발생 수 있는 문제점을 줄일 수 있는 방법은

 클래스를 사용하는 것이다 !!

 

ex)

public class MemberInfo
{

private String id;

private String name;

 //get메서드

}

다음과 같이 한 개의 속성을 이용해서 저장할 수 있다.

<% 

   MemberInfo memberInfo=new MemberInfo(id,name);

   session.setAttribute("memberInfo",memberInfo);

%>

또한 연관된 정보를 한 객체에 담아 저장하기 때문에, 세션에 저장한 객체를 사용할 때에도 다음과 같이

객체를 가져온 뒤 객체로부터 필요한 값을 읽어올 수 있다.

 

<%
	MemberInfo member=(MemberInfo)session.getAttribute("memberInfo");
    
    %>
    ...
    
    <%=member.getnName()%>