웹개발시 사용자 세션정보를 확인할때 필수로 사용되는 HttpSession 객체와 세션에 대한 정리이다.
1. 개념
* 세션(Session) 이란?
HTTP 기반으로 동작하는 클라이언트가 서버에 정보를 요청할 때 생성되는 '상태정보' 이다. HttpSession이라는 인터페이스 객체로 표현되며, HttpSession 객체는 HttpServletRequest의 getSession() 메소드를 이용하여 생성할 수 있다.
* HttpSession
HttpSession 객체가 생성될 때는 요청을 보내온 클라이언트의 정보, 요청 시간 정보 등을 조합한 세션 ID가 부여되며,
이 세션 ID는 클라이언트 측에 쿠키로 저장된다. 클라이언트마다 개별적으로 생성되어 유지되는 HttpSession 객체는 요청을 보내온 클라이언트와 서버간에 일정 시간(최대 시간은 브라우저가 살아 있는 동안) 동안 각 클라이언트의 상태정보를 서버에 저장하여 유지하고자 하는 목적으로 사용되는 객체이다.
HttpSession 객체는 서버에 생성되며,
클라이언트에는 세션 ID가 쿠키 기술로 저장되어
각 클라이언트에 대해 생성되는 HttpSession 객체를 클라이언트마다 개별적으로 유지 및 관리한다.
* 세션 트래킹
클라이언트마다 개별적으로 HttpSession가 생성된다고 위에 언급하였다. 이떄,
해당 상태정보를 일정 시간 동안 개별적으로 유지하여 사용하는 기술을 '세션 트래킹(session tracking)'이라고 한다.
세션 트래킹 기능의 구현 순서는 다음과 같다.
1) 클라이언트를 위한 세션을 준비한다. 이전에 이 클라이언트를 위해 생성된 세션이 이미 존재하면 존재하는 세션을 추출하고, 그렇지 않으면 새로 생성한다. 세션이 새로 생성될 때는 고유한 ID가 하나 부여되며, 이 ID는 클라이언트에 쿠키 기술로 저장된다.
2) 유지하고자 하는 정보를 저장할 목적의 객체를 생성하여 세션에 등록한다.
3) 클라이언트가 요청을 전달할 때마다 세션에 등록된 정보를 담고 있는 객체를 추출하여 원하는 기능에 사용한다.
4) 세션이 더 이상 필요없는 시점에서 세션을 삭제한다.
따라서 -클라이언트 개발시, 사용자 세션과 관련된 부분을 개발할때 서버의 세션 객체를 죽인 후 재실행 하지 않으면 기존 세션을 사용하는 등 원하는 결과를 얻지 못할 수 있다!!
* HttpSession 생성
HttpSession 객체를 사용하고자 할 때는 개발자가 수동으로 생성하는 것이 아니라, 메소드를 이용하여 생성하거나 기존의 HttpSession 객체의 주솟값을 추출하여 사용한다. HttpSession 객체를 얻으려면 HttpServletRequest 객체의 다음 메소드를 사용해야 한다.
- HttpServletRequest의 getSession()
- 클라이언트가 가지고 있는 세션 ID와 동일한 세션 객체를 찾아서 주솟값을 반환한다. 만일 세션이 존재하지 않으면 새로운 HttpSession 객체를 생성하여 반환합니다.
이때 getSession에 불리언 타입의 배개변수를 던질 수 있는데,
매개변수 값이 true이면 getSession() 메소드와 마찬가지로 새로운 HttpSession 객체를 생성하여 반환하고
false이면 새로운 HttpSession 객체를 생성하지 않고 null을 반환합니다.
* 예시
만약 웹개발시 사용자 세션정보가 null일 경우 예외처리를 해야한다면,
getSession에 다음과 같이 false를 매개변수로 하여 null 을 반환받을 수 있다.
HttpSession session = request.getSession(false)
if(session == null) {
// 세션객체가 없을 경우
}
'과거의 이력 > JAVA' 카테고리의 다른 글
[JAVA] HashMap LinkedHashMap 차이점 (0) | 2022.08.08 |
---|---|
[error] 자바 Required String parameter is not present 에러 원인 (0) | 2022.07.14 |
[JAVA] 변수 타입 확인하기 (0) | 2022.07.12 |
Spring Boot에서 Vue 프로젝트를 띄우기 위한 구성 (0) | 2022.06.08 |
[Java] HashMap 배열의 타입? (java.util.ArrayList cannot be cast to [Ljava.lang.String) (0) | 2022.03.19 |