티스토리 뷰
4) Session이란?
세션
- 클라이언트 별로 서버에 저장되는 정보입니다.
- 로그인 정보나 장바구니 정보 등 클라이언트 별로 유지시키고 싶은 정보가 있을 때 세션을 사용하게 됩니다.
이용 방법
- 웹 클라이언트가 서버측에 요청을 보내게 되면 서버는 클라이언트를 식별하는 session id를 생성합니다.
- 서버는 session id를 이용해서 key와 value를 이용한 저장소인 HttpSession을 생성합니다.
- 서버는 session id를 저장하고 있는 쿠키를 생성하여 클라이언트에 전송합니다.
- 클라이언트는 서버측에 요청을 보낼때 session id를 가지고 있는 쿠키를 전송합니다.
- 서버는 쿠키에 있는 session id를 이용해서 그 전 요청에서 생성한 HttpSession을 찾고 사용합니다.
- 다시 정리하면 우선 클라이언트가 서버에 요청을 하게 되면 이 클라이언트만 가질 수 있는 세션 id라는 것을 하나 발급합니다.
- 그리고 해당 세션 id를 이용해서 key와 value를 이용한 저장소인 HttpSession을 생성을 하는데 이 HttpSession은 key와 value를 쌍으로 가지는 이 값을 저장할 수 있는 저장소입니다. 그리고 이 세션 id를 가지고 쿠키를 하나 만듭니다. 세션 id는 유일하므로 session id를 가지고 있는 이 쿠키를 클라이언트한테 보내게 될 거예요. 그럼 이 세션 id에 해당하는 쿠키를 이 클라이언트는 가지게 됩니다.
- 만약 다른 클라이언트가 서버한테 요청을 하게 되면 서버는 해당 클라이언트에 해당하는 세션 id를 하나 발급할 겁니다. 그리고 이 세션 id에 해당하는 HttpSession 객체와 저장소도 또 만들게 될 겁니다. 그리고 해당 세션 id를 값으로 가진 쿠키도 발급할 것이고 그 쿠키를 해당 클라이언트한테 보내게 될 겁니다.
- 또 다른 클라이언트의 요청이 들어오면 서버는 똑같은 과정을 통해 해당 클라이언트에게 쿠키를 전달합니다.
- 이렇게 되면 쿠키를 갖고 있는 각각의 클라이언트가 요청을 할 때마다 자신의 쿠키와 쿠키의 세션 id를 가지고 서버한테 요청을 하게 됩니다. 그러면 해당 서버는 이 세션 id에 해당하는 저장소를 찾을 수 있을 것이고 저장소에 있던 해당 클라이언트만의 정보를 사용할 수 있게 해줍니다.
세션 생성 및 얻기
HttpSession session = request.getSession(); HttpSession session = request.getSession(true); |
- HttpSession 객체는 new라는 연산자로 직접 생성하지 않습니다. 서버가 알아서 만듭니다.
- 그래서 request로부터 getSession() 이라는 메서드를 수행을 하게 되면 클라이언트로부터 받아온 요청에서 쿠키가 있는지 없는지, 세션 id로 되어있는 쿠키가 있는지 없는지를 확인하고 만약에 있다면 세션을 반환합니다. 없다면 새로 만들어서 세션을 반환을 하게 됩니다.
- getSession()이라는 메서드가 파라미터가 없는 것과 있는 것으로 오버로딩 되어 있습니다. 이때 인자가 없는 메서드는 이 true라는 값을 받아들인 메서드랑 똑같이 동작합니다. 세션이 있다면 세션을 return 해주고 없다면 새로 하나 만들어서 세션을 생성해줍니다.
- 이때 새롭게 생성된 세션인지 알아낼 수 있는 메서드는 isNew()라는 메서드입니다. HttpSession의 해당 메서드를 이용하면 이 세션이 지금 처음 새롭게 생성이 된 건지 아니면 기존에 있었던 세션인지 알아낼 수가 있습니다.
HttpSession session = request.getSession(false); |
- request의 getSession()메소드에 파라미터로 false를 전달하면, 이미 생성된 세션이 있다면 반환하고 없으면 생성하지 않고 null을 반환합니다.
세션에 값 저장
setAttribute(String name, Object value) |
- name과 value의 쌍으로 객체 Object를 저장하는 메소드입니다.
- 세션이 유지되는 동안 저장할 자료를 저장합니다.
세션 값 조회
- getAttribute(String name) 메서드
- 세션에 저장된 자료는 다시 getAttribute(String name) 메소드를 이용해 조회합니다.
- 반환 값은 Object 유형이므로 저장된 객체로 자료유형 변환이 필요합니다.
- 메소드 setAttribute()에 이용한 name인 “id”를 알고 있다면 바로 다음과 같이 바로 조회합니다.
String value = (String) session.getAttribute("id"); |
세션 값 삭제
- removeAttribute(String name) 메소드
- name값에 해당하는 세션 정보를 삭제합니다. - invalidate() 메소드
- 모든 세션 정보를 삭제합니다.
javax.servlet.http.HttpSession
반환형 |
메소드 이름 |
메소드 기능 |
long |
getCreationTime() |
세션이 생성된 시간까지 지난 시간을 계산하여 밀리세컨드로 반환 |
String |
getId() |
세션에 할당된 유일한 식별자(ID)를 String타입으로 반환 |
int |
getMaxInactiveInterval() |
현재 생성된 세션을 유지하기 위해 설정된 최대 시간을 초의 정수형으로 반환, 지정하지 않으면 기본 값은 1800초, 즉 30분이며, 기본 값도 서버에서 설정 가능. |
Object |
getAttribute(String name) |
name이란 이름에 해당되는 속성값을 Object 타입으로 반환, 해당되는 이름이 없을 경우에는 null을 반환. |
Enumeration |
getAttributeNames() |
속성의 이름들을 Enumeration 타입으로 반환. |
void |
invalidate() |
현재 생성된 세션을 무효화 시킴. |
void |
removeAttribute(String name) |
name으로 지정한 속성의 값을 제거. |
void |
setAttribute(String name, Object value) |
name으로 지정한 이름에 value 값을 할당. |
void |
setMaxInactiveInterval(int interval) |
세션의 최대 유지시간을 초 단위로 설정. |
boolean |
isNew() |
세션이 새로이 만들어졌으면 true, 이미 만들어진 세션이면 false를 반환. |
- 세션은 클라이언트가 서버에 접속하는 순간 생성
- 특별히 지정하지 않으면 세션의 유지 시간은 기본 값으로 30분 설정합니다.
- 세션의 유지 시간이란 서버에 접속한 후 서버에 요청을 하지 않는 최대 시간입니다.
- 30분 이상 서버에 전혀 반응을 보이지 않으면 세션이 자동으로 끊어집니다.
- 이 세션 유지 시간은 web.xml파일에서 설정 가능합니다.
- 세션을 이용할 때마다 계속 30분씩 갱신이 됩니다.
<session-config> <session-timeout>30</session-timeout> </session-config> |
생각해보기
- 쿠키는 이름과 값이 모두 문자열이지만, 세션의 키값은 문자열이고 값은 객체를 저장할 수 있습니다. 왜 이런 차이가 있을까요?
참고 자료
[참고링크] Interface HttpSession
https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpSession.html
[참고링크] HttpSession interface https://www.javatpoint.com/http-session-in-session-tracking
'부스트코스 웹 프로그래밍 > 5. 웹 앱 개발: 예약서비스 3' 카테고리의 다른 글
5. Spring 에서의 Session 사용법 - BE (0) | 2019.08.10 |
---|---|
4. 상태유지기술(Cookie & Session) - BE (5) (0) | 2019.08.09 |
4. 상태유지기술(Cookie & Session) - BE (3) (0) | 2019.08.09 |
4. 상태유지기술(Cookie & Session) - BE (2) (0) | 2019.08.09 |
4. 상태유지기술(Cookie & Session) - BE (1) (0) | 2019.08.09 |