💥 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();
라고 하는데 토큰에 대해서는 아직 자세히 배우지 않아서 이건 다음 기회에..!