HTTP는 한 번 통신할 때 무조건 클라이언트와 서버가 있다.
반드시 클라이언트에서 리퀘스트를 보내며, 서버에서는 리스폰스가 돌아온다.
무조건 통신은 클라이언트로부터 시작된다.
리퀘스트 메시지
: 클라이언트가 리퀘스트 보내는 양식
: 메소드, URI, 프로토콜 버전, 옵션 리퀘스트 헤더 필드와 엔티티로 구성
리스폰스 메시지
: 프로토콜 버전, 상태 코드, 프레이즈, 옵션 리스폰스 헤더 필드와 바디로 구성
HTTP는 스테이트리스(stateless) 프로토콜이다.
HTTP는 URI를 이용해 인터넷 상의 리소스를 지정한다.
HTTP/1.1에서 사용 가능한 메소드들
리퀘스트 URI로 식별된 리소스를 가져오도록 요구. 서버가 해석한 결과를 받아온다.
엔티티 전송에 사용되며, 리스폰스에 의한 엔티티의 획득만이 목적이 아니라는 점에서 GET과 차이
리퀘스트 중 포함된 엔티티를 리퀘스트 URI로 지정한 곳에 보존 (=파일 전송)
메시지 바디를 돌려주지 않는 GET. URI 유효성 확인과 리소스 갱신 시각 확인 목적으로 사용
PUT 메소드와 반대. 리퀘스트 URI로 지정된 리소스의 삭제 요구
리퀘스트 URI로 지정한 리소스가 제공하고 있는 메소드를 조사
웹 서버에 접속, 자신에게 통신을 되돌려 받는 루프백(loop-back) 발생시킨다.
리퀘스트를 보낸 곳에 어떤 리퀘스트가 가공되어 있는지 조사할 수 있어 프록시 서버 경유 등 origin 서버 접속 시 리퀘스트가 가공될 때 동작 확인 용으로 사용한다.
단, 보안 이슈가 있기에 보통 사용하지 않는다.
프록시에 터널 접속 확립을 요하여 TCP 통신을 터널링 시킬 때 사용한다.
암호화 된 것을 터널링시킬 때 주로 사용
리소스에 어떤 행동을 하기 원하는지 지시하기 위해 존재하며, 메소드는 대소문자를 구별하기 때문에 대문자로 기재해야 한다.
지속 연결 (Persistent Connections)
: 초기 HTTP에서 발생하는 불필요한 TCP 통신량 문제를 해결하기 위해 고안되었다.
: 어느 한 쪽이 명시적으로 연결을 종료하지 않는다면 TCP 연결을 계속 유지한다.
: TCP 커넥션의 오버헤드를 줄임으로써 서버 부하 경감과 웹 페이지의 빠른 표시 구현 가능
파이프라인화 (HTTP pipelining)
: 지속 연결로 인해, 리스폰스를 기다리지 않고 여러 리퀘스트를 병행해서 보낼 수 있다.
: 따라서 리퀘스트 수 늘어날 수록 효과 good
쿠키는 HTTP의 스테이트리스 특성에 따라 발생하는 문제를 해결한다.
문제
: HTTP는 지난 리퀘스트와 리스폰스를 관리하지 않기에 과거 상태를 기반으로 현재 리퀘스트를 처리할 수 없다.
: 상태를 유지하지 않음으로써 얻는 리소스 소비의 억제를 포기할 수 없다.
해결
: stateless 프로토콜의 특징은 유지하면서 쿠키 도입
쿠키
: 리퀘스트와 리스폰스에 쿠키 정보를 추가해 클라이언트의 상태를 파악한다.
(1) 리스폰스 헤더 필드에 포함되어 클라이언트에 보존된다.
(2) 클라이언트가 다음 리퀘스트를 보낼 때, 자동으로 쿠키를 함께 송신한다.
(3) 서버는 받은 쿠키를 이용해 어느 클라이언트인지 확인하고, 서버 상의 기록을 이용해 이전 상태를 파악한다.