세션 : 클라이언트의 상태를 저장할 수 있다.
※쿠키와 다른점 : 웹 브라우저가 아니라 서버에 값을 저장한다.
세션은 오직 서버에만 생성된다.
서버는 세션을 사용해서 클라이언트 상태를 유지 할 수 있다.
로그인한 사용자 정보를 유지하기 위한 목적으로 세션을 사용한다.
웹 컨테이너는 기본적으로 한 웹 브라우저마다 한 세션을 생성한다.
같은 페이지라도 웹 브라우저에 따라 다른 세션을 사용한다.
=> 즉! 쿠키: 클라이언트 측의 데이터 보관소
세션: 서버 측의 데이터 보관소
* 세션 생성
page 디렉티브의 session 속성을 true로 설정 (디폴트값이므로 저절로 생성됨)
웹 브라우저가 처음 접속할 때 세션을 생성하고, 이후로 생성된 세션 사용
session 클래스의 setAttribute, getAttribute메서드 사용
※ request.getSeesion() 메서드를 이용해서 세션을 생성할 수도 있다.(이때 page 디렉티브의 session 속성 값은 false로 설정해야 한다)
session 기본 객체는 웹 브라우저의 여러 요청을 처리하는 JSP 페이지 사이에서 공유 된다.
따라서 로그인한 회원정보등 웹 브라우저와 일대일로 관련된 값을 저장할 때에는 쿠키 대신 세션을 사용.
※ 쿠키 대신 세션을 사용하는 가장 큰 이유
세션이 쿠키보다 보안에서 앞선다. 쿠키는 네트워크를 통해 전달되므로 HTTP프로토콜을 사용하는 경우 외부인이 중간에 쿠키의 값을 읽어올 수 있다. 하지만 세션의 값은 서버에만 저장되기 때문에 중요한 데이터를 저장하기에 알맞다.
그렇지만 세션은 여러서버에서 공유할 수 없다는 단점이 있다. 반면 쿠키는 도메인을 이용해서 여러 도메인 주소에 공유할 수 있다. ex) Daum 포털 사이트
* 세션 종료
session.invalidate()메서드 사용 => session 기본 객체 삭제
* 세션 유효시간
1. WEB=INF\web.xml 파일에 session-config 태그 사용, sessino-timeout 태그 값(분 단위)으로 설정
<session-config>
<session-timeoout>50</session-timeout>
</session-config>
※ 값을 0 이나 음수로 설정하면 invalidate()메서드를 호출하기 전까지 세션 객체가 서버에 유지되므로 메모리 부족 현상이 발생할 수 있다. 반드시 세션 타임아웃 시간을 지정해 주는 것이 좋다.
2. session 객체의 setMaxInactiveInterval 메서드 사용(초 단위)
session.setMaxInactiveInterval(60*60);
* 연관된 정보 저장을 위한 클래스 생성
세션에 여러 속성을 사용해서 연관정보들을 저장할 때, 속성값이 증가할수록 코드를 작성/분석/관리하는데 많은 시간이 소요된다. 예를 들면 이메일 주소 정보가 더는 필요하지 않아서 세션에 저장하지 않았는데 실수로 그 코드를 남겨둘 경우 NullPointerException이 발생할 수 있고 발생원인을 찾느라 시간을 허비할 수도 있다.
그러한 문제점을 줄이기 위해 클래스를 사용한다. 연관정보를 클래스로 묶어서 저장하면 각 정보를 개별 속성으로 저장하지 않고 한개 속성을 이용해서 저장 할 수 있게 된다. 세션에 저장한 객체를 사용할 때도 마찬가지다.
* 서블릿 컨텍스트와 세션
같은 서버에서 서로 다른 웹 어플리케이션은 각각 서로 다른 JSESSIONID 값을 사용한다.
세션 ID를 보관할 때 사용할 JSESSIONID 쿠키의 경로로 웹 어플리케이션의 컨텍스트 경로를 사용하기 때문이다.
같은 웹브라우저라도, 서로 다른 웹 어플리케이션에서는 세션을 공유하지 않는다.
'Web > JSP' 카테고리의 다른 글
[MySQL] ERROR : The server time zone value ~ is unrecognized or represents more than one time zone. (0) | 2021.01.04 |
---|---|
[Tomcat] 콘솔 한글 깨짐 해결 (1) | 2020.12.24 |
[JSP] Cookie 기본 개념 (0) | 2020.02.26 |
[Tomcat] cookie domain error (0) | 2020.02.26 |
[Error] java.lang.NoSuchMethodError (0) | 2020.02.24 |