http 특징
- Connectless : 연결 유지 x
- request 보내고 response를 받으면 연결 해제
(Connectless ⇒ 유한한 네트워크 자원의 효율적 사용)
- Stateless : 상태 정보 유지 x, 서버측에서 클라이언트에 대해 모름
- 기존 request에서 무엇을 했는지 알 수 없음 → 보완책 : Session Tracking
(stateless ⇒ 서버의 확장을 가능하게 함)
Session Tracking
: 일정 시간동안 동일한 사용자로부터 들어오는 여러 요청들을 하나의 상태로 처리할 수 있도록 만들어주는 기술 ⇒ Cookie, Session
✍🏻출처: [JSP] 쿠키 씹어 먹기 실습
Cookie : 브라우저에 저장할 수 있는 데이터 조각들
- Cookie : client측 저장,( name, value, 도메인, 경로, 유효기간)
- 단점 : 크기 제한, string을 저장 가능, 사용자 차단 가능, 보안의 취약
- 쿠키 생성
- cookie c = new Cookie(name, valus);
- c.setMaxAge(쿠키 만료 시간)
- response.addCookie(c)
- 쿠키 조회
Cookie[] c = request.getCookie();
브라우저에서 서버로 자원 요청을 하고 요청 대상인 jsp페이지(서버)는 쿠키를 생성한다. 즉, 쿠키를 생성하는 것은 서버
다. 요청을 받은 서버는 처리가 되면서 쿠키가 생성된다. 그리고 응답을 할 때, response헤더에 쿠키 정보를 추가하여 응답을 준다.
쿠키가 들어있는 response헤더를 받은 브라우저는 브라우저 안에 쿠키를 저장할 수 있는 공간(쿠키 저장소)에다가 해당 쿠키값을 저장해둔다.
브라우저에서 쿠키 값을 왜 저장해 둘까요? 서버가 만들어놓은 쿠키 값을 응답 받아서 왜 쿠키를 저장해둬야할까요? ⇒ 로컬에 저장된 쿠키는 결국 브라우저가 사용하기 위해서 저장하는 거다. 근데 부라우저에서 쿠키를 만든게 아니라 서버에서 만들어서 응답으로 주면 그걸 쿠키로 저장해 두는 거다. 이렇게 저장된 쿠키는 나중에 해당 서버로 요청을 할 때마다 그 서버가 발급해준 쿠키를 무조건 포함해서 보내게 되어있다.
브라우저에서 서버로 요청을 보낼 때, 해당 서버로 부터 발급받은 쿠키라면 request에 항상 포함
해서 같이 보내게 동작을 합니다. 그래서 서버에서는 그 요청 안에 쿠키 값을 꺼내면 그 쿠키 안에 들어있는 데이터가 어떤 의미를 갖고 있는지 알 수 있고, 이것을 통해서 어떤 필요한것(장바구니, id기억하기 등)들을 처리 할 수 있다.
- 웹 클라이언트(브라우저)에 저장해놓고 웹 서버로 request마다 포함하여 전송
- 용도: 웹 서비스를 이용하는 동안 유지할 데이터를 저장하는 용도(공개되어도 괜찮은 정보만)
- 유효 시간동안 브라우저에서 유지
- 세션 쿠키 : 세션과 연결되어 세선이 유지되는 동안에만 저장되는 쿠키
- 영구 쿠키(시간 설정): 설정한 시간동안 브라우저에 저장되는 쿠키
- 장바구니, ID기억하기(로그인 할 때, 아이디 기억하기 체크박스)
- 비회원으로 장바구니에 상품을 담았을 때, 나중에 다시 들어가도 장바구니에 해당 상품이 들어있다.
- ID기억하기 체크하고 로그인을 하면 나중에 컴퓨터를 재부팅하고 다시 사이트에 접속하더라도 아이디가 기록되어 있게 한다. (보통 3개월 내지 6개월)
- 어제 구매 고민하던 상품들이 전혀 상관없는 사이트에서 귀신같이 옆에 광고로 뜬다. 나의 쿠키정보가 쇼핑 사이트를 돌아다니면서 브라우저에 저장되어있고 그 상관없는 사이트에서 뭔가 쇼핑몰과 연계가 있어서 그 쇼핑몰에서 발급받은 어떤 쿠키들을 이용해서 맞춤형 광고를 할 수 있다.
Session : 서버에서 생성되는 기본 객체, 브라우저를 식별하고 브라우저에 관련된 데이터를 서버에 저장하기 위해서 사용.
브라우저가 보낸 요청을 서버가 받았을 때, 서버는 그 요청을 어떤 브라우저가 보낸 건지 식별을 해야 한다. 최초로 서버에 요청을 했으면 이 브라우저에 대한 내용이 누군지 모를거다. 서버 입장에서는 어떤 브라우저가 요청을 한 것인지 알 수 가 없다. 그러면 서버쪽에서는 이 브라우저를 식별할 수 있도록 세션
이라는 기본 객체를 하나 만든다. 그리고 만들어진 세션 객체에는 세션 ID
라고하는 값이 하나 있다. 그러면 이 세션을 앞에서 우리가 확인해봤었던 쿠키에 이 세션 값을 담아서 쿠키로 생성해서 response(응답)을 하게 된다. 그러면 브라우저는 그 쿠키를 자신의 브라우저 로컬에 저장을 한다.
그리고 이렇게 브라우저에 저장이 된 쿠키는 해당 서버로 요청을 할 때마다 같이 포함해서 보낸다. 서버에서는 요청(request)에서 쿠키정보를 확인한다. JSESSIONID(톰캣) 쿠키의 값을 이용하여 브라우저를 식별한다. 그래서 이러한 형태의 아이디 값을 포함한 쿠키를 요청할 때마다 같이 보내주게 되고 서버 입장에서는 요청 안에 포한된 쿠키 정보 중에서 JSESSIONID라는 이름을 가진 쿠키가 있다면 이 쿠키에 들어있는 세션 정보를 통해서 어떤 브라우저인지 식별할 수 있게 된다. 서버에서는 요청된 내용 안에서 쿠키 정보를 확인한다.
세션은 브라우저마다 하나씩 만들어지는 거니까 이를 활용해서 로그인을 했을 때, 클라이언트에 저장시키면 위험하고 민감한 정보들을 세션에다가 저장할 수 있다.
세션은 브라우저를 종료시켜서 종료된다는 메시지가 서버에 전달되거나 또는 서버쪽에서 해당 세션 기본 객체의 invalidate() 호출시 제거된다. 녹색 세션을 제거하고 나서 두번째(녹색)브라우저가 다시 요청을 했을 때, 녹색 쿠키 정보가 서버에 온다. 그런데 서버에 녹색 섹션 정보가 없으니까 처음 본 브라우저로 보고 session을 새로 다시 만들고 그 session 정보를 가진 쿠키로 응답을 주게 되고 브라우저는 쿠키를 다시 저장하게 된다.
- 웹 서버에 요청을 보낸 웹 클라이언트(브라우저)를 구분(식별)하기 위해 사용한다. session은 브라우저 당 하나씩 만들어지는 객체로 서버에 존재한다.
- JSP와 이를 처리하는 톰캣에서는 최초 요청할 때, 내장객체(기본객체)로 세션이 생성됨(이 때 Session ID도 생성)
- 생성된 세션에 setAttribute((Object)”key”, (Object)“value”); getAtribute(”key);를 이용해서 값을 저장하고 사용한다. 이러헥 저장해 둔것은 세션이라는 기본객체를 이용해서 어디서든 나중에 필요할 때, session.getAtribute()해서 확인해볼 수 있다.
- 세션은 브라우저를 식별 할 수 있으니까 A브라우저가 서버에 요청을 해서 뭔가 동작을 하다가 유지시켜 놓을 필요가 있는 값이 있으면 쿠키로 응답을 줘도 되지만 서버 자체의 세션에다가 어떤 값을 담아둘 수 있다. 그럼 이 브라우저가 해당 페이지말고 다른 페이지를 처리하는 중에 아까 세션에 담아놓았던 값을 필요로 한다면 session.getAtribute()로 저장해둔 값을 필요할 때마다 꺼내 사용할 수 있다.
- 세션은 클라이언트(브라우저)에서 알 수 없다. 클라이언트 입장에서 세션에 어떤 값이 저장되어 있는지 확인할 길이 없다. 그런 기능이 서버에 있어야만 되는 거고 그래서 중요한 정보를 저장할 때 용이하게 작용한다.
- 로그인한 id의 개인정보를 브라우저에 주지 말고 서버에서 현재 로그인한 사용자에 대한 개념을 계속 유지하고 있는거다. 브라우저에다가는 필요할 때만 값으로 응답하게 하고 직접적으로 이 세션 안에 있는 정보를 알 수 는 없게 됩니다.
- 브라우저가 닫혔을 때, 통신을 안하겠다는 TCP/IP통신이 일어난다. 그 때 톰캣을 그 세션 객체를 메모리에서 제거한다.
- 쿠키와 세션의 차이점: 쿠키는 브라우저가 기억을 하고 있다. 세션은 서버쪽에 데이터를 저장한다.
- 세션 삭제: session.invalidate()로 세션 정보 삭제(무효화)
- 유효시간 설정: session.setMaxInactiveInterval(10); //10초로 세션 유지 시간 설정 (0 이나 음수인 경우, 계속 서버에 세션 유지됨)
- 유효시간 설정: 배포설정자 (web.xml) → 페이지마다 하나씩 설정하는게 아니라 이 서버에 접속했을 때, 만들어지는 모든 세션의 기본(default) timeout을 설정함.
<session-config>
<session-timeout>1</session-timeout>
</session-config>
- session.setAttribute(name, value); : 세션에 저장 ⇒ 세션은 브라우저에서 동작하는 동안에 서버쪽에 유지할 데이터를 저장하는 용도. (세션이 유효한 동안만 사용가능)
- session.setAttribute(name);