- 비연결성(Connectionless) : 클라이언트가 요청하고 서버가 해당 요청에서 적합한 응답하고 바로 끊는 성질
- 무상태(Stateless) : 비연결적인 특성으로 연결 해제되면서 서버와 클라이언트는 요청한 결과에 대해서 잊어버린다. 같은 답을 원해도 다시 서버에 연결해서 요청 시도해야한다.
- 연결 상태 처리, 상태 정보를 관리할 필요가 없어 서버 디자인이 간단하다.
- 각각의 HTTP 요청에 독립적으로 응답한다.
- 이전 통신의 정보를 모르기 때문에 매번 인증이 필요하고 이를 해결하기 위해 세션과 쿠키를 이용한다.
- HOL(Head Of Line) Blocking - 특정 응답 지연
- RTT(Round Trip Time) 증가
- 헤비한 Header 구조
- Multiplexed Streams : 한 커넥션에 여러 개의 메세지를 동시에 주고 받을 수 있습니다.
- Stream Prioritization : 요청 리소스 간의 의존 관계를 설정
- Server Push : HTML 문서 상에 필요한 리소스를 클라이언트 요청없이 보내줄 수 있습니다.
- Header Compression : Header 정보를 HPACK 압축 방식을 이용해 압축 전송합니다.
- TCP를 기반으로 만들어진 패킷이 HTTP이다.
- 클라이언트는 TCP 3way handshake를 수행하고 Client Hello를 전송한다, 암호화 알고리즘 목록 전달
->
서버- 클라이언트
<-
Server Hello, 암호화 알고리즘 선택, 인증서 전달
- 인증서에는 서버가 발행한 공개키가 들어 있고, CA(Certificate Authority, 인증기관)의 개인키로 암호화되어 있다.
- 클라이언트는 CA의 공개키로 인증서 검증을 한다.
- 검증 후 클라이언트 대칭키(비밀키) 생성하고 SSL 인증서 내부에 있던 공개키로 암호화하여 대칭키를 전달
->
서버- 이 후 대칭키를 통해 암호화하여 통신한다.
- 캐싱 가능, 멱등성 보장
- 캐싱 불가능, 멱등성 보장X
- text로 저장, 쿠키 저장시 만료 안되면 삭제 안됨, 세션보다 빠름, 보안에 취약
- Object로 저장, 브라우저 종료시 삭제, 쿠키보다 느림, 보안에 비교적 좋음
String user = httpSession.getAttribute("user");
여기서 session의 값을 가져오는 key는 “user”입니다. 사용자 A가 접속해도 “user”로 값을 가져오고, 사용자 B가 접속해도 “user”로 가져오는데 어떻게 A와 B가 접속했을때 서로 다른 결과값을 받을수 있나요?
- 즉 클라이언트의 컨텍스트를 서버에 저장하지 않는다.
- 서버에 상태를 저장해야하기 때문에 해당 서버를 늘리고 싶을 때(Scale out) 늘리기 전의 서버에만 존재하므로 문제가 생길 수 있다.
- 쿠키도 클라이언트 쪽에 저장되어 있고 역시 헤더에 해당 값을 보내면 상태가 유지되므로 stateless 하다고 할 수 없다.
- 서버에 별도의 세션 저장소가 없어도 되고, Stateless하고 signature를 통한 보안성을 가지고 있다.
- DNS(Domain Name System) : 도메인 이름을 실제 네트워크 상에서 사용하는 IP 주소로 바꿔주는 시스템, 계층 구조를 가지는 분산 데이터베이스 구조를 가진다.
- 순서 보장, 1:1 통신, 수신 여부 확인, 신뢰성 높음, 속도 느림
- 흐름 제어, 혼잡 제어, 오류 제어
- 파일 교환, 문자 등
- 순서 보장X, 1:1 or 1:N or N:N 통신, 수신 여부 확인X, 신뢰성 낮음, 속도 빠름
- 접속 요청 : 클라이언트 SYN
->
서버- 요청 수락 : 클라이언트
<-
SYN + ACK 서버- 연결 : 클라이언트 ACK
->
서버
- 연결 종료 요청 : 클라이언트 FIN플래그
->
서버- 요청 확인 : 클라이언트
<-
ACK 서버- 연결 종료 : 클라이언트
<-
FIN플래그 서버- 연결 종료 확인 : 클라이언트 ACK
->
서버
- 물리적인 주소로 MAC을 사용
1 Physical Layer : 물리적 연결, 데이터를 전기 신호로 바꿔 주고 받는 기능을 하는 계층 (단위 : bit, 장비 : 케이블, 리피터, 허브)
아A 파P 서S 탈T 났N 다D 픽PHY
->
1 캡슐화(하나씩 쌓임), 1 ->
7 역캡슐화우리가 실제로 사용하는 네트워크는 TCP/IP입니다.
- 프로그램(브라우저)이 직접 상호작용하는 레이어, 어플리케이션이 데이터를 교환하기 위해 사용하는 프로토콜을 정의
- IP와 Port를 통해 프로세스와 통신, 어플리케이션 계층과 데이터그램 통신서비스 제공, 통신 노드 간의 연결 제어, 신뢰성 있는 데이터 전송 담당
- 네트워크 상 최종 목적지까지 정확하게 연결되도록 연결성을 제공
- TCP/IP 패킷을 네트워크 매체로 전달하는 것과 네트워크 매체에서 TCP/IP 패킷을 받아들이는 과정을 담당
- 물리적인 주소로 MAC을 사용
Reference:
String user = httpSession.getAttribute("user");
여기서 session의 값을 가져오는 key는 “user”입니다. 사용자 A가 접속해도 “user”로 값을 가져오고, 사용자 B가 접속해도 “user”로 가져오는데 어떻게 A와 B가 접속했을때 서로 다른 결과값을 받을수 있나요?