Search
📗

HTTP Network Basic - 우에노 센

1. 웹과 네트워크의 기본

가. HTTP 버전

HTTP/1.0: 1996년 정식 사양으로 공개, 초기사양, RFC1945 발행
HTTP/1.1: 1997년 공개, 개정판 RFC2616 버전 발행
→ 현재 가장 많이 사용되는 버전
HTTP/2.0: 책정은 되어 있지만 널리 사용되지 않고 있음

나. TCP/IP

TCP/IP: 인터넷과 관련된 프로토콜의 모음
→ 인터넷 상의 서로 다른 규격(하드웨어, OS 등)을 가진 컴퓨터 간의 통신을 지원하기 위해 일정한 규칙이 필요함
→ 이러한 규칙을 프로토콜이라함
TCP/IP 4계층: 어플리케이션 계층, 트랜스포트 계층, 네트워크 계층, 링크 계층
→ 계층화의 장점 1) 에러 발생 시, 에러 발생 지점을 특정할 수 있음 2) 설계 시, 계층 간 규칙을 지킨다는 전제 하에 내부는 자유롭게 만들 수 있음
→ 어플리케이션 계층: 어플리케이션 통신 ex) HTTP
→ 트랜스포트 계층: 데이터 흐름 통제 ex) TCP/UDP
→ 네트워크 계층: 목적지 노드까지의 여러 선택지 중 하나의 길 결정 ex) IP
→ 링크 계층: 하드웨어 ex) NIC

다. IP/TCP/DNS

IP: 도착지 정보(MAC 주소, IP 주소)를 기반으로 ARP 활용하여 중간지점을 들려서 목적지에 도착
그 누구도 인터넷 전체를 파악하고 있지 않다
→ IP 주소: 도착지 노드 주소, 변경 가능
→ MAC 주소: 네트워크 카드(NIC)에 할당된 주소, 고유함
TCP: 정보의 단위를 잘게 쪼개어 데이터의 흐름을 원활하게 하고, 3-handshaking으로 신뢰성 있는 데이터 통신을 지원함
DNS: 텍스트 기반의 호스트 주소를 컴퓨터가 이해할 수 있는 IP주소로 변경

마. URI vs URL

URI: 표준형, URL을 포함하는 포괄적인 개념
URL: URI 보다 과거에 사용되던 표현
→ 클라이언트의 GET 요청에 따라 특정 자원을 할당받을 때 사용되었음

2. HTTP, 간단한 프로토콜

가. HTTP 규칙

HTTP 통신은 클라이언트와 서버를 구분함
→ 클라이언트는 서버에 요청(request)을 보내고 서버는 이에 대해 응답(response)을 보냄
HTTP 통신은 반드시 클라이언트의 request로부터 시작됨

나. Request message 구성

→ 빨간색: 메소드, URI, 프로토콜 버전
→ 파란색: 옵션 리퀘스트 헤더 필드
→ 초록색: 엔터티
GET /index.html HTTP/1.1 Host: www.hackr.jp Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 16 name=ueno&age=37
Plain Text
복사
Response message 구성
→ 빨간색: 프로토콜 버전, 상태코드, 상태코드 설명
→ 파란색: 옵션 리스폰스 헤더 필드
→ 초록색: 바디
HTTP/1.1 200 OK Date: Tue, 10 Jul 2012 06:50:15 GMT Content ~~~ <html> ...
Plain Text
복사

다. Stateless

Request나 Response의 내용은 일회성이므로 해당 메세지가 HTTP에 저장되지 않음
→ 많은 데이터를 빠르게 처리하기 처리하기 위함
→ 이를 보안하기 위해 쿠키, 세션, 토큰 등의 기술 도입

라. Request URI

Request 시, URI를 포함하여 웹 상의 특정 자원을 지정하여 요청할 수 있음

마. HTTP 메소드

GET: 리소스 취득, Request URI로 특정된 리소스를 요청
POST: 엔티티 바디 전송, 일반적으로 request 메세지에 엔티티 포함하여 전송 시 사용됨
PUT: 파일 전송, Request에 포함된 엔티티를 Request URI로 지정한 곳에 저장
→ HTTP/1.1에 자체 인증 기능이 없기 때문에 일반적인 웹 사이트에는 사용되지 않음
→ 웹 어플리케이션의 인증과 함께 사용되거나 REST에 사용됨
DELETE: 파일 삭제, Request URI로 지정된 자원의 삭제를 요청함
→ 상세 설명은 PUT과 동일
HEAD: 메시지 헤더 취득, GET과 같은 기능을 수행하지만 response에 바디는 없고 header만 돌려받는다
→ URI 유효성 체크 및 리소스 갱신 시간 확인 목적으로 사용됨
OPTIONS: HTTP 메소드 중 지원하는 것 확인
TRACE: loop-back 발생,
→ 보안상의 이유로 잘 사용되지 않음
CONNECT: 프록시에 터널링 요구

바. (TCP 상) 지속연결

비지속연결: HTTP 초기 버전, 매번 Request Response 반복할 때마다 TCP의 3-handshaking 시도
지속연결: Client나 Server에서 TCP 연결해제 전까지 Request, Response 교차 반복
→ HTTP/1.1부터 정식사양으로 채택
파이프라인화: Request와 Response 각각에 대해 기다리지 않고 연속적으로 여러 request나 response 전달
→ request 3개를 동시에 먼저 보내고, response 3개가 동시에 오는 방식

사. 쿠키

HTTP의 Stateless를 보완하기 위해 도입
서버에서 특정 Client의 접속 기록을 유지하기 위해 사용됨
서버에서 최초 response 전송 시, response의 헤더 중 Set-Cookie 필드에 cookie를 포함해서 보냄
위의 response를 받은 client는 다음 request 때부터 해당 cookie를 포함하여 보냄
request에 포함된 cookie와 서버의 cookie를 비교하여 연결상태 확인

3. HTTP 메세지

가. request message and response message

최초의 개행 문자(CR+LF)로 메시지 헤더와 메시지 바디로 구분
Request Header
→ 리퀘스트 라인: 메소드, request URI, HTTP version
Response Header
→ 상태 라인: 상태 코드와 설명, HTTP version

나. 인코딩으로 전송 효율 높이기

HTTP로 데이터 전송 시 인코딩으로 전송 효율 높일 수 있음
메시지 바디: 8비트로 구성되어 통신
엔티티 바디: Request와 Response의 payload로 전송되는 정보
→ 엔티티 헤더 필드와 엔티티 바디로 구성
HTTP 메세지 바디의 역할: 엔티티 바디 운반
→ 인코딩 적용 시 엔티티 바디 내용이 변화됨
콘텐츠 코딩: 엔터티에 적용되는 인코딩
청크 전송 코딩(Chunked Transfer Coding): 사이즈가 큰 데이터를 전송할 경우 엔티티 바디를 분할해서 전송

다. 멀티파트

여러 개의 엔티티를 하나의 메시지 바디 내부에 포함시킬 수 있음
멀티파트 사용 시 헤더 필드에 Content-type 추가

라. 기타

레인지 리퀘스트: 전체가 아니라 일부에 대한 범위를 지정해서 리퀘스트
네고시에이션: 같은 리소스에 request하지만 조건에 따라 적합한 response를 받음

4. HTTP 상태 코드

상태 코드가 현재 상황과 불일치할 수도 있다

가. 2xx 성공(Success)

Request 정상 처리
200 OK: 일반적인 request 정상 처리
204 No Content: 정상 처리 되었지만, Client에서 정보를 보내고 Server로부터 정보를 받지 않는 경우
206 Partial Content: 정상 처리 되었지만, Server가 부분적인 GET Request를 받은 경우

나. 3xx (Redirection)

Request 완료하기 위해 클라이언트에서 추가 동작 필요
301 Moved Permanently: 해당 URI에 대한 재확인 통보
→ Request URI에 대한 수정 필요
→ 주로 URI 마지막에 슬래시가 빠져서 받는 상태 코드
http://example.com/sample
Plain Text
복사
302 Found: 해당 URI에 대한 일시적인 변경이 있음을 통보
→ Request URI에 대한 수정 필요
→ 단, METHOD의 변경을 금지함
ex) HTTP 표준, POST 요청을 GET 요청으로 redirect 금지. 하지만 업계에서는 이를 무시하고 POST 요청을 GET 요청으로 redirect하는 것이 관례화
→ HTTP/1.1 이후 302의 역할을 303과 307로 분할함
303 See Other: Request URI에 대한 리소스가 다른 URI에 할당되어 있으며, 다른 URI에 대해 GET으로 얻을 것을 명시
304 Not Modified: 조건부 리퀘스트에 대해 해당 조건이 일치하지 않음을 통보
307 Temporary Redirect: 최초 Request URI에 대해 변경된 URI로 재요청 필요
→ 최초의 요청의 method와 엔티티 바디를 그대로 이용해야 함
→ 최초의 요청이 POST 방식으로 회원가입에 필요한 정보를 담은 바디를 포함했다면, 재요청의 경우도 POST 방식이어야 하고 최초 회원가입 정보도 포함해야 함

다. 4xx Client Error

서버에서 Request 이해 불가
400 Bad Request: Request 구문이 잘못되어 있음을 통보
401 Unauthorized: 전달 받은 Request에 HTTP 인증 정보가 필요함을 통보
403 Forbidden: Request URI에 대한 접근 거부
→ 접근 거부 이유를 엔티티 바디에 기재하여 client에 통보함
→ 접근 거부 이유는 IP 주소의 접근제어, 파일 시스템에서 허가 받지 않은 유저 차단 등
404 Not Found: Request URI에 해당하는 자원이 서버에 없음
→ 서버에서 해당 Request에 대해 거부하고 싶을 때도 사용됨

라. 5xx Server Error

서버에서 Request 처리 실패
500 Internal Server Error: Request 처리 중 문제 발생
503 Service Unavailable: 서버가 과부하 or 점검 상태

5. HTTP와 웹 서버

가. 가상 호스트의 존재

공통의 IP주소를 공유하는 다수의 가상 호스트 존재
정확한 송신을 위해 Request 보낼 때 Host 헤더 필드에 Host명 명시

나. 통신 중계

통신 중계란 클라이언트와 서버 중간에 위치하여 중계 프로그램 다음의 서버로 Request를 보내고 Response를 받아와서 보내는 것
프록시: Client와 Server 사이에서 서버와 클라이언트의 역할 수행
→ 기본 동작 1) 클라이언트로부터 받은 Request에 대해 내용 변경하지 않고 다음 서버로 전송함
2) 서버로부터 받은 Response도 프록시 서버를 거쳐서 Client에 도달
→ 여러대의 프록시 서버 경우 가능
→ 프록시 서버 사용 이유
1) 캐싱 프록시: 프록시 서버에 특정 리소스에 대한 캐시를 보관해서 Client의 request가 빈번한 자원에 대해 origin server를 거치지 않고 프록시 서버에서 처리
2) 엑세스 제한 및 엑세스 로그 획득: Client의 Request가 Origin Server에 도달하기 전에 프록시 서버에서 request에 대한 접근제한을 걸거나 관련 접근 로그를 획득
게이트웨이: 중계서버지만 client의 request에 대해 마치 origin server인것 처럼 보여짐
→ 게이트웨이 다음의 서버는 HTTP 이외의 통신 프로토콜을 사용함으로써 client와 게이트웨이 사이의 통신 안정성을 높여줌
터널: 다른 서버와의 통신 경로를 확립함
→ HTTP request에 대해 해석하지 않고 그대로 다른 서버로 중계함

다. 캐시

캐시: 프록시 서버와 클라이언트 disk에 보관된 origin server의 resource의 사본
캐시의 유효성: Origin Server의 원본 리소스와 캐시의 일치여부를 확인하기 위해 주기적으로 origin server를 방문함
클라이언트 캐시: 브라우저 자체적으로 캐시를 보관하여 request resource가 해당 캐시에 있다면 서버에서 가져오지 않고 자체 해결함

6. HTTP 헤더

가. HTTP 메시지 헤더

나. HTTP 헤더 필드

다. HTTP/1.1 일반 헤더 필드

라. Request 헤더 필드

마. Response 헤더 필드

바. 엔터티 헤더 필드

사. 쿠키를 위한 헤더 필드

아. 기타

7. HTTPS와 보안

8. 인증

9. HTTP 프로토콜

10. 웹 콘텐츠 사용 기술

11. 웹 공격 기술

Reference

우에노 센, HTTP Network Basic