session이란?
세션과 쿠키를 사용하는 이유는 HTTP프로토콜의 특징이자 약점을 보완하기 위해서다.
HTTP프로토콜은 비연결지향, 무상태 프로토콜이다.
클라이언트가 서버에 요청했을때 응답을 보낸 후 연결을 끊는 처리방식을 가지고 있고,
데이터를 유지하지 않는다.
하지만 로그인이나, 장바구니에 상품을 담아놓거나하는 경우에는 데이터 유지가 필요하다.
이 경우를 위해 쿠키와 세션을 사용한다.
먼저 세션과 쿠키의 가장 큰 차이점은 정보가 어디에 저장되느냐이다.
쿠키는 클라이언트(로컬)에 저장되고, 세션은 서버에 저장된다.
만료시점은 별도로 지정이 가능하고, 쿠키는 로컬에 저장되어 보안상 위험이 있기 때문에
요즘은 잘 사용하지 않는다고 한다.( 로그인유지 기능 등을 제외하고)
쿠키는 로컬에 저장되기 때문에 속도가 비교적 빠르고 세션을 서버의 데이터를 참조해야해서 비교적 느린편이다.
세션이 쿠키에 비해 보안이 높지만 쿠키를 사용하는 이유는 세션은 서버에 저장되어 서버자원을 사용하기 때문에,
사용자가 많을 경우 소모되는 자원이 상당하다.
사용자가 많을 수록 쿠키와 세션을 적절히 병행사용하여 서버자원의 낭비를 줄이는 것도 웹사이트의 성능향상에 기여할 수 있을 것이다.
Session
우선 세션은 사용자가 웹 브라우저를 통해 웹서버에 접속한 시점부터 웹 브라우저를 종료해서 연결을 끝내는 시점까지,
같은 사용자로부터 오는 요청을 하나의 상태로보고, 일정하게 유지하는 기술이다.
웹서버의 서블릿 컨테이너에 상태를 유지하고,
웹서버에 저장되는 쿠키이기 때문에 (세션쿠키) 저장데이터에 제한이 없다.
각 클라이언트의 고유세션ID를 부여하고 세션ID로 클라이언트를 구분하여 각 클라이언트 요구에 맞는 서비스를 제공한다.
이용순서
- 클라이언트가 서버측에 요청을 보내면, 서버는 http-request의 헤더필드에 cookie를 확인하여, 클라이언트가 해당 세션ID를 보냈는지 확인.
- 세션ID가 존재하지 않는다면, 세버는 세션ID를 저장하고 있는 쿠키를 생성해 클라이언트에게 전송
- 클라이언트는 서버측에 요청을 보낼때, sessionID를 가지고 있는 쿠키를 전송.
- 서버는 쿠키에 있는 sessionID를 이용해서 그 전 요청에서 생성한 HttpSession을 찾고 사용
한마디로 로그인할때 서버가 클라이언트에 세션ID를 주고, 클라이언트는 쿠키에 세션ID를 저장한다.
로그인한 상태에서 해당 웹을 여기저기 돌아다니며 요청을 보낼때마다(이동하면서 웹이 새로고침 될 때 마다)
sessionID가 포함된 쿠키를 서버로 전송해서,
서버는 로그인을 확인하고 그에 맞는 로직을 실행한다,(sessionID에 맞는 세션을 준다)
그 후 브라우저를 닫거나 세션을 종료하면(로그아웃) 세션ID가 담긴 세션쿠키는 삭제된다.
Cookie
사용자의 클라이언트에 저장하는 기록데이터 파일이다.
클라이언트에 총 300개의 쿠키가 저장 가능하고, 하나의 도메인당 20개의 쿠키를 가질 수 있다.
하나의 쿠키는 4kb까지 저장이 가능하다.
이용순서
- 서버에서 클라이언트의 브라우저로 전송되어 사용자의 컴퓨터에 저장된다.
- 저장된 쿠키는 다시 해당 웹에 접속할때, 브라우저에서 서버로 쿠키를 전송한다.
- 쿠키는 이름과 값으로 구성된 자료를 저장한다.
쿠키는 세션과 다르게 브라우저로 전송되어 저장된다.(사용자의 로컬)
그래서 브라우저를 닫아도 계속 쿠키정보가 사용자의 컴퓨터에 남아있다.
세션과의 차이는
세션 - 서버에 쿠키가 있고, 브라우저는 서버에서 받은 세션ID로 서버에 Request함
쿠키 - 클라이언트 로컬에 쿠키가 있고, 브라우저는 쿠키에 저장된 자료를 서버로 Request함
이런 특성 때문에, 쿠키는 위에서 언급했듯이 장바구니, 자동로그인등의 기능에 사용된다.
실제로 네이버에 들어가서 로그인을 할 때,
자동로그인을 체크하고 f12 - 응용프로그램탭 - 쿠키에 들어가서 쿠키를 삭제하면 자동로그인이 해제되는 것을 볼 수가 있다. 쇼핑몰의 장바구니 같은 기능또한 물론이다.
이제 스프링 사용시에 세션에 대해서 알아보려고 한다.
이렇게 만들어진 세션을 제어하기 위해서 Java의 interface인 HttpSession객체를 사용한다.
위에서 설명했지만 쿠키는 Http-header필드에 담겨 전송된다.
Http프로토콜의 전송방식을 보면
클라이언트가 URL을 입력하면(웹에 들어오면) HTTP Request가 Servlet Container로 전송한다.
jsp를 뷰로 사용한 경우 서블릿 컨테이너에서 jsp - servlet 클래스 - html 클래스 형식의 변환이 이뤄지며
Request와 Response가 이뤄지는데 ,
Session은 서블릿 컨테이너에서 서버와 클라이언트간의 제어가 이루어진다.
그럼 HttpSession은 언제 만들어질까?
스프링에선 HttpSession을 주입해야 할때 내부적으로 서블릿컨테이너에게 Session을 달라고 한다.
1.
@Autowired나 @Inject 같은 의존성 주입으로 HttpSession을 주입받으면,
서블릿 컨테이너에게 session을 달라고 요청하지 않고,
set이나 getAttribute같은 api를 호출하는 시점에 요청과 생성이 일어난다.
2.
매개변수를 통해 HttpSession을 받으면, 선언시 sessoin을 요청한다.
이를 통해 session의 유지는
- 로그인이 성공하면 발급받은 SessionID를 클라이언트에게 전달하고
- 클라이언트는 이후 요청을 할 때, 서버로부터 받았던 SessionID를 함께 넘겨준다.
- 서블릿 컨테이너에서는 http-header에 SessionID가 있으면 Session을 새로 발급하지 않고,
- 전달받은 SessionID와 매핑되는 기존의 Session을 할당해준다.
'SPRING > Spring' 카테고리의 다른 글
페이징에 대하여 (0) | 2021.12.09 |
---|---|
스프링에서 ajax 사용의 유형들 (0) | 2021.10.30 |
[스프링]HTTP프로토콜과 URI를 통한 요청 (0) | 2021.09.08 |
DataAccessException 란? -Spring 예외처리 (0) | 2021.08.12 |
HttpserveltRequest와 HttpSession,세션과 로그인 로그아웃 (0) | 2021.08.03 |