목차
HTTP
서버와 클라이언트가 텍스트, 이미지, 동영상 등의 데이터를 주고받을 때 사용하는 프로토콜. 기본적으로 텍스트를 전송한다.
특징
TCP/IP 기반으로 한 지점에서 다른 지점으로 요청을 보내고 받음.
-
무상태성 (Stateless)
- 클라이언트와 서버가 각각 HTTP로 통신할 때, 상대방의 State를 기억하거나 저장하지 않는다.
-
비연결성 (Connectionless)
- 요청을 받은 서버가 응답을 마치면, 소켓을 유지하지 않고 연결을 끊는다.
- 요청에는 반드시 응답이 일대일로 대응된다.
- 서버가 응답을 보내더라도, 클라이언트가 받지 못할 수 있으므로 클라이언트가 각 상황별 대응을 결정해야 함
- 클라이언트는 일정 시간 응답이 없으면 timeout -> 요청 실패로 간주함
-
TCP 위에 텍스트 기반의 HTTP Header와 메시지를 사용하므로, 헤더 크기가 크다.
타임아웃 시간과 최대 재시도 횟수는
- 전체 로직에서 서버 응답이 지닌 중요성
- 서버의 평균 부하
- 실패확률
등을 따져보고 결정해야 한다. 클라이언트가 기다려야 하는 최대 시간이 사용자 관점에서 납득 가능한지도 생각해야 함.
cf. TCP와의 차이점
- TCP는 stateful. 주고받을 메시지가 없거나, 연결을 끊기 전까지는 연결이 유지된다.
- Binary 데이터를 사용하므로 HTTP보다 패킷크기가 작고, 처리속도가 빠름. 많은 사용자를 처리해야 할수록 유리한 구조
- 다만, 일반적으로 서비스는 통신 처리 시간 < 로직 처리 시간이므로 프로토콜 속도차이는 유의미하지 않다.
구조
Request Header
첫 줄 = 요청 줄. 아래의 순서를 지킨다.<요청 메소드> <URL경로> <HTTP버전>\r\n
GET / HTTP/1.1\r\n 형태일 경우
- 요청 메소드는 GET, 루트 경로 (/) 요청, HTTP 버전은 1.1
User-Agent, Host, Connection - HTTP 헤더 값이며, 요청에 관련된 추가 설정.
- Host : URL 제외한 경로 주소. 포트번호도 넣을 수 있지만 필수는 아님. HTTP : 포트 80, HTTPS : 포트 443
- User-Agent : HTTP 요청이 발생한 웹 브라우저 정보.
- Accept : 클라이언트가 처리할 수 있는 데이터 형태.
- Content-Type: 메시지 바디의 형태를 표시.
- 웹서비스에서 중요한 부분. Content Type값에 따라 브라우저의 동작이 바뀔 수 있기 때문.
ex) application/json일 경우 브라우저는 보안을 이유로 메시지 바디에 있는 자바스크립트 동작을 막는다.
악성 스크립트를 JSON으로 위장했을 경우가 있을 수 있음. - 위와 같은 사례를 CSRF (Cross-site Request Forgery) 또는 Json 하이재킹이라고 부른다.
- 혹시라도 응답 과정에서 데이터가 변조될 수 있으므로 Content Type을 text/plain, application/json으로 명시하는 것이 좋다.
- 웹서비스에서 중요한 부분. Content Type값에 따라 브라우저의 동작이 바뀔 수 있기 때문.
- Content-length: 메시지 바디 길이
- Connection: keep-alive : HTTP 1.1부터 지원.
- HTTP 통신이 완료되더라도 일정 시간은 TCP 소켓이 연결을 유지한다.
- 매번 통신할 때마다 TCP 연결을 새로 맺는 대신, 기존의 연결을 활용
\r\n\r\n - 헤더와 메시지 바디 경계 구분자.
Response Header
- Response Code
- 2xx : 정상
- 4xx : 클라이언트 측 문제
- 5xx : 서버 측 문제
메소드
-
GET - 조회
- 클라이언트가 서버에 페이지를 요청할 때 사용.
- 읽기 요청이므로 메시지 바디값은 없음.
- 요청주소에 ?와 &를 구분자로 사용하는 QueryString 사용.
- ?는 첫 번째 파라미터, &는 파라미터 사이를 구분하는 용도
-
POST - 생성
- 클라이언트가 서버로 데이터를 전송해 새로운 값을 생성할 때 사용.
-
PUT, PATCH
- PUT: 리소스의 모든 필드를 교체할 때 사용. 일부만 전달할 경우, 전달한 값 외의 나머지는 Null 처리하는 것이 원칙
- PATCH: 부분 교체. 리소스의 일부 필드를 교체할 때 사용.
-
DELETE - 삭제
-
OPTION - 특정 엔드포인트가 어떤 메소드를 허용하는지 확인하고자 할때 사용함.
- Allow: HEAD, GET, POST, OPTIONS 형태
URI와 URL
http://도메인:포트/{Servlet Path}/{Path}?{name=value}&{name=value}
-
URL : Uniform Resource Locator.
- HTTP에서 통신 대상을 식별할 때 사용한다.
- 통신을 위한 IP주소를 사람이 보기 쉽게 매핑한 것
-
URI : Uniform Resource Identifier. 특정 자원의 고유 식별자를 지칭한다.
- 문서나 영상과 같은 자원의 위치를 가리킬 때 사용하는 용어.
- URL뿐만 아니라 XML 등에도 사용. URL -> URI는 의미상 통하지만, 그 역은 통하지 않는다.
ex) http://test.com/test.pdf?docid=111 이라는 주소가 있을 때
URL는 http://test.com/test.pdf. 해당 자원의 위치를 정의한 것.
URI는 ?docid=111까지 포함. 이 쿼리스트링에 따라 결과값이 달라질 수 있으므로, 원하는 자원을 요청할 유일한 식별자이기 때문
HTTP 버전
- 1.1 : HTTP의 첫번째 표준.
- Connection을 재사용 (keep-alive의 도입)
- 파이프라이닝으로 latency 감소. 첫 번째 요청에 응답이 완전히 전송되기 전에 두 번째 요청을 전송할 수 있도록.
- 텍스트 기반 프로토콜
- 2.0
- 요지: http1.1보다 빠르고, 통신 부하가 적도록 설정
- Multiplexed Stream 도입. 한 번의 Connection으로 동시에 여러 개의 데이터를 주고받을 수 있음
- Stream의 우선순위 설정 가능
- Server push. html 문서에 필요한 정보는 클라이언트 요청 없이도 전송
- 중복되는 헤더 값 압축
- Binary 기반 프로토콜
- 현재 많은 http 프로토콜이 사용하고 있는 버전. http1.1의 영향력이 점차 줄어들고 있음.
Nginx와 Apache
HTTP 표준에서 정의하는 기능을 바로 사용할 수 있는 웹서버 소프트웨어.
- 아파치 : 오랜 역사가 입증한 안정성. 인증과 같은 많은 기능 제공.
- 사용자 수가 늘어날수록 처리가 비효율적인 다중 프로세스 구조 사용
- nginx : 아파치보다 뛰어난 성능과 가벼운 구조.
- horizontal scale에 유리한 단일스레드 + 이벤트 기반 동작.
참고:
- 학교에서 알려주지 않는 17가지 실무 개발 기술
- https://goldfishhead.tistory.com/26
- https://http3-explained.haxx.se/ko/h3/h3-h2
- https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
- https://developers.google.com/web/fundamentals/performance/http2/?hl=ko
|
'학습일지 > 네트워크' 카테고리의 다른 글
gRPC (1) - gRPC의 특징 및 성능확인 (0) | 2021.06.11 |
---|---|
WebRTC - 개념과 통신방식, 프로토콜 (0) | 2021.02.17 |
[Edwith] 통신의 기초 5. 통신보안 (0) | 2020.02.05 |
[Edwith] 통신의 기초 4. 이동통신 (0) | 2020.01.30 |
[Edwith] 통신의 기초 3강. 인터넷 (0) | 2020.01.23 |