다음과 같은 경우, 계산 버튼을 눌렀을 때 두번째로 깨어나는 서블릿은 앞에서 저장한 값을 가지고 계산해야 한다. 그래서 서블릿끼리 그 값을 저장하여 공유할 수 있는 공간이 필요하다.
서블릿은 한번 올라갔다가 죽지만 값은 저장할 수 있는 공간이 있다.
: 책갈피처럼 서블릿들간에 문맥을 이어갈 수 있도록 하는 저장소.
서로 자원을 공유할 수 있도록 하는 저장소.
A 서블릿이 결과물을 저장하면 B서블릿이 결과물을 이어서 새로운 결과물을 만들어낼 수 있도록 한다.
: 현재 접속자마다 그 공간이 달라진다. 브라우저가 달라지면 다른 사용자로 인식한다 = 세션이 다르다.
저장소를 session객체로 변경
그러나 크롬 브라우저로 여러개를 띄워 확인해보면 같은 세션으로 인식한다.
여러 프로세스가 동작하는게 아니라 하나의 프로세스 아래에 하위 흐름을 가지고있는 스레드 개념으로 창을 띄우는 것이다. 스레드들은 그 하나를 공유하는 것이므로 같은 사용자로 인식하는것이다.(창만 여러개일 뿐 같은 브라우저로 인식)
그렇다면 웹서버는 어떻게 사용자를 식별할까?
: Session은 개인별 사물함이다.(ex.헬스장) 사용자 요청이 오면 서블릿이 실행되는데 서블릿을 실행하는 그 요청이 처음 왔을 경우는 새로운 사용자로 인식한다. 세션ID를 가지고 있는 사람만이 세션공간에 값을 넣을 수 있는데 처음에는 ID가 없기 때문에 Application 공간을 쓰고, 갈 때 ID(107)를 부여해준다. 이 때 107이라는 회원 공간이 만들어진다. 그래서 같은 사용자의 다음 요청부터는 107에 저장할 수 있게 된다.
웹서버는 ID가 다르면 사용자가 다르다고 본다.
실제로 브라우저는 ID를 가지고 전달할까?
YES.
ID는 쿠키로 전달된다. 브라우저를 닫으면 쿠키가 사라져서 ID도 사라진다.
세션의 기본 timeout은 30분이다. (tomcat에서 확인 가능)
시간을 설정할 수도 있다.
: 클라이언트에 저장하는 공간 .
(application, session은 서버쪽 공간)
그래서 서버에 부담을 주지 않는다.
클라이언트(브라우저)에 보내고싶으면 addCookie()를 이용한다.
브라우저는 쿠키가 왔네?하고 읽어서 자신이 갖게 된다.
내가 심었던 쿠키를 키값으로 찾아서 가져올 수도 있다.
이때 쿠키는 여러개일 수도 있으므로 배열로 가져온다.
쿠키값은 url에서 사용 가능한 문자열로 보내야 한다.
클라이언트에 addCookie()로 보내면 response의 header에 심어지는 형태로 전달이 된다.
여러개의 서블릿을 실행하는데 같은 쿠키를 가지면 안된다.
url과 관련된 서블릿에게만 쿠키 값이 전달될 수 있도록 설정해야한다.
setPath() : 어느 경우에 사용자에게 전달되어야 하는지 정하는 경로
루트 경로를 주었으므로 어떤 서블릿을 요청하든 이 쿠키들의 값이 전달된다.
즉, 특정 경로(url)에서만 쓰이도록 쿠키를 전달할 수도 있는 것이다.
브라우저를 닫으면 쿠키는 사라지지만 maxAge를 통해 쿠키 만료날짜를 설정할 수도 있다.
서버의 생명 주기와 상관 없이 브라우저가 데이터를 가지고있을 수 있다.
기간이 길거나 (ex.1년, 세션 timeout을 넘어가는 시간이라면)
또한 특정 url에서만 값이 쓰일 때 --> 쿠키가 적합하다.
특정 사용자만 쓸 수 있도록 할 때 --> Session이 적합하다.