💥 http의 기본 특성 💥
비연결성(Connectionless)
: 클라이언트와 서버가 한 번 연결을 맺은 후, 클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 연결을 끊어버리는 성질무상태(Stateless)
: 비연결성으로 인해 서버가 클라이언트를 식별하지 못하는 상태>> 다 이유는 있다..💨
서버가 모든 클라이언트와의 연결을 유지하면 많은 리소스 발생
하지만 서버가 클라이언트를 기억하고 있지 않으면,
1) 동일한 클라이언트의 모든 요청에 대해 매번 새롭게 연결/해제 과정 진행 = 연결/해제에 대한 오버헤드 발생!
KeepAlive로 개선
: Http의 KeepAlive 속성으로 지정된 시간동안 서버-클라이언트 간 패킷 교환이 없을 시 확인용 패킷 주기적 발송, 패킷에 반응이 없으면 연결 끊음! (주기적으로 클라이언트 상태를 체크하는 것이 완벽한 해결책은 ❌)
2) 웹에서 물건 구매하는 상황 가정
이렇게 매번 새로운 인증을 해야하는 클라이언트 측 번거로움 발생
http는 위의 기본 특성에 따라 클라이언트 정보를 기억하고 있지 않기 때문에,
상태 유지 처리는 개발자가 코드로 구현하여 처리해주어야 함
👇 개발자가 구현하는 상태 유지 처리 방법 👇
- 로그인 ~ 로그아웃까지의 고유한 user 인증 및 권한 부여를 위한 기본 설정
- web page 이동 방식(forward, redirect)과 무관하게 상태 유지
클라이언트 시스템
에 상태 유지 값 몰래 스윽 저장문자열(String)
한정[생성 및 저장]
Cookie cookie = new Cookie("key", "value");
cookie.setMaxAge(초단위로 저장 기간 설정); //client 시스템에 잔존 시간 설정
response.addCookie(cookie); //client 시스템에 전송해서 저장
... 여러 개 생성 가능
[활용]
Cookie[] 변수명 = request.getCookies();
getName() - key 반환
getValue() - value 반환
서버 시스템
에 상태 유지 값 저장 → 쿠키보다 보안 고려 + 안정적객체 타입
이라면 다 가능!세션의 원리
1. 웹 컨테이너가 클라이언트 한 명씩 구분하여HttpServletRequest
개별 생성
2. 해당 클라이언트에 매핑된 상태 유지 정보가 없을 경우HttpSession
객체 생성, 이미 있을 경우 재사용
그렇다면, 다수의 클라이언트들을 어떻게 구분하는걸까?
1. 클라이언트(유저)가 접속하면 무조건JSESSIONID
를 중복되지 않도록 랜덤하게 생성하여 매핑
2. 해당 값을쿠키🍪
로 저장
3. 웹 컨테이너가JSESSIONID
로 클라이언트를 구분하여 특정 클라이언트(유저)에 대한 상태 유지 값을 세션에 저장
[생성 및 저장]
HttpSession session = request.getSession();
session.setAttribure("key", value);
[활용]
HttpSession session = request.getSession();
Object 변수명 = session.getAttribute("key");
//세션 자원 보호를 위해서 가령 login 후 logout 시에 반드시 자원 해제
session.invalidate();
라고 하는데 토큰에 대해서는 아직 자세히 배우지 않아서 이건 다음 기회에..!