1. 세션
세션이란 쿠키를 이용해 서로 관련된 요청들을 하나로 묶은 것과 같다. (쿠키가 브라우저에 저장되므로)브라우저마다 개별 저장소(session객체)를 서버에서 제공해 준다.
차이점을 보자면 쿠키는 브라우저에, 세션은 서버에 저장된다는 점이다.
원래 요청과 응답은 독립적이다. 그러나 요청마다 브라우저가 쿠키를 이용해 세션ID를 보내줘서, 같은 세션ID를 가진 요청들을 하나로 묶는 것과 같다.
브라우저에서 요청을 보내면 서버는 무조건 세션 객체를 생성한다.(세션마다 세션ID 가지고 있음) 그리고 세션ID를 쿠키에 담아서 브라우저에 전송한다. 그러면 다음 요청부터는 브라우저가 세션ID정보를 쿠키에 담아서 서버에 전송한다. 즉 서버는 세션ID를 통해 같은 브라우저에서 온 요청인지 아닌지 알 수 있다.
세션ID는 브라우저마다 생성되므로, 같은 PC라도 브라우저가 다르면 세션ID가 다르다.
컨트롤러에서는 아래와 같이 세션저장소를 생성할 수 있다.
HttpSession session = request.getSession(); // 세션 저장소 생성(해당하는 세션 객체 가져오기)
session.setAttribute("id","asdf"); // 세션에 정보 저장
요청이 들어오면 우선 요청헤더의 쿠키에 있는 세션ID가 필요하므로 request객체가 필요하다. 그리고 세션ID와 세션객체의 ID를 비교해서 요청한 브라우저에 해당하는 세션 객체를 가져온다.
2. 세션과 관련된 메서드
메서드 | 설명 |
String getId() | 세션의 ID를 반환 |
long getLastAccessedTime() | 세션 내에서 최근 요청을 받은 시간을 반환 |
boolean isNew() | 새로 생성된 세션인지를 반환. request.getSession() 호출 후 사용 |
void invalidate() | 세션 객체를 제거(저장된 객체도 함께) = 세션 즉시 종료 |
void setMaxInactiveInterval(int interval) | 지정된 시간(초)후에 세션을 종료(예약 종료) |
int getMaxInactiveInterval() | 예약된 세션 종료 시간을 반환 |
속성 관련 메서드 | 설명 |
void setAttribute(String name, Object value) | 지정된 값(value)을 지정된 속성 이름(name)으로 저장 |
Object getAttribute(String name) | 지정된 이름(name)으로 저장된 속성의 값을 반환 |
void removeAttribute(String name) | 지정된 이름(name)의 속성을 삭제 |
Enumeration getAttributeNames() | 기본 객체에 저장된 모든 속성의 이름을 반환 |
3. 세션의 종료
1) 수동 종료
HttpSession session = request.getSession();
session.invalidate(); // 1. 세션 즉시 종료
session.setMaxInactiveInterval(30*60); // 2. 예약 종료 (30분 후) - 초 단위
2) 자동 종료 - web.xml
<session-config>
<session-timeout>30<session-timeout> <!-- 분 단위 -->
</session-config>
4. 쿠키 vs 세션
세션은 브라우저에 부담이 많이 되므로 최소한의 데이터만 저장하도록 한다.
쿠키(Cookie) | 세션(Session) |
브라우저에 저장 | 서버에 저장 |
서버 부담 X | 서버 부담 O |
보안에 불리 | 보안에 유리 |
서버 다중화에 유리 | 서버 다중화에 불리 |
5. 세션 필요할 때 시작하기
세션은 서버에 부담이 많이 된므로 최대한 사용을 줄이는 게 좋다.
처음 화면에 들어와서 로그인 전까지는 세션이 필요한 일이 거의 없으므로 로그인 성공 시 부터 세션을 사용하도록 해주는 게 좋다.
이 떄 session=true, session=false 옵션을 사용해 줄 수 있다. 세션이 있을 때 두 옵션은 모두 세션은 안 만든다. 차이점은 세션이 없을 경우 true옵션은 세션을 생셩하고, false 옵션은 생성하지 않는다. 참고로 session=false 옵션이 기존의 세션에 영향을 주지 않는다.
즉 세션이 필요없는 JSP화면은 session=false 옵션을 주면 된다.
그리고 session=false일 경우 sessionScope와 pageContext.session을 사용 불가하다. jsp파일에서 세션에 있는 id를 받아올 일이 있을 경우 sessionScope.id 를 pageContext.request.session.getAttribute('id')와 같이 변경해야한다!
디폴트 값이 true 이므로, 아래 사진과 같이 세션이 필요없는 jsp파일의 상단에 <%@ page session="false" %> 옵션을 주면 된다.
<c:url /> 태그 사용하기!!
브라우저에서 쿠키 차단을 설정했을 경우, 서버가 응답으로 세션ID를 보내줘도 브라우저는 쿠키로 저장하지 않는다. 따라서 URL 뒤에 쿼리스트링으로 세션ID를 붙여서 이동해야 하는데, 주소에 <c:url /> 태그를 사용했을 경우 자동으로 세션ID를 URL 뒤에 붙여준다. 따라서 주소를 적을 경우 해당 태그를 사용하는 습관을 들이자..
참고로 서버가 처음 응답시에는 브라우저가 쿠키를 허용하는지 안 하는지 알 수 없다. 따라서 첫 응답시에만 1.응답헤더로 전송 2.URL 뒤에 세션ID붙임 이렇게 두 가지 방법으로 세션ID를 전달해준다. 두 번째 응답부터는 쿠키를 허용하는 브라우저일 경우에는 요청헤더가 세션ID를 쿠키에 담아서 전달하므로 1.응답헤더로 전송 방법으로만 세션ID를 전달한다.
물론 <c:url /> 태그로 주소를 입력했을 경우에만 자동으로 URL 뒤에 붙여주므로, 꼭 태그를 사용해서 주소를 입력하도록 하자!!
참조
https://fastcampus.co.kr/dev_academy_nks
'3. Back-end > 3-2. Spring MVC - 남궁성' 카테고리의 다른 글
Spring MVC - [ 예외처리 ] (0) | 2023.01.30 |
---|---|
Spring MVC - [ 로그인 시 원래 목적 페이지로 이동 ] (0) | 2023.01.29 |
Spring MVC - [ Cookie(쿠키) ] (2) | 2023.01.27 |
Spring MVC - [ redirect와 forward ] (0) | 2023.01.26 |
Spring MVC - [ EL표현식 + JS Template Literal ] (2) | 2023.01.23 |