零。추가적인 상식
OSI(Open System Internetwork) 참조 모델:
- 애플리케이션 계층
애플리케이션에 네트워크 통신 인터페이스 제공
-
표현 계층
-
세션 계층
-
전송 계층
데이터 전송 단위는메시지
- 네트워크 계층
데이터 전송 단위는패킷
- 데이터 링크 계층
데이터 전송 단위는프레임
- 물리 계층
데이터 전송 단위는비트 bit
OSI7 계층은 연구용 이론 모델이며, 실제 적용에는 너무 복잡하므로 TCP/IP 참조 모델이 있습니다:
P.S.여기서의 TCP/IP 는 프로토콜 체계, 또는 프로토콜 제품군을 지칭하며, SNMP, ICMP, UDP, DNS 등 다양한 네트워크 프로토콜을 포함합니다
- 애플리케이션 계층
HTTP, FTP, DNS 등
- 전송 계층
TCP, UDP 등
- 네트워크 계층
IP 등
- 데이터 링크 계층
HTTP 는 애플리케이션 계층 프로토콜이며, 내부는 전송 계층의 TCP 와 네트워크 계층의 IP 이므로, HTTP 도 3 웨이 핸드셰이크, 4 웨이 핸드셰이크가 필요합니다
따라서 연결 설정/해제의 오버헤드가 존재하며, 성능 최적화를 위해 HTTP/1.1 버전은 기본적으로 퍼시스턴트 연결이지만, HTTP/1.0 에는 없습니다
또한, 몇 가지 개념을 간단히 구분할 필요가 있습니다:
- 프록시
전달 기능이 있는애플리케이션
- 게이트웨이
다른 서버 통신 데이터를 전달하는서버
- 터널
Client 와 Server 간의 통신 연결을 유지할 수 있는애플리케이션
- 터널
一.URI 와 URL
-
URI(Uniform Resource Identifier): 통합 자원 식별자, 특정 인터넷리소스를 식별하는 문자열
-
URL(Uniform Resource Locator): 통합 자원 위치 지정자, 특정 인터넷리소스의 위치를 식별하는 문자열
URL 에 필수적인 것은 스키마 (Scheme), 호스트명 (Host), 리소스 경로 (URL Path) 입니다
따라서 URL 은 URI 의 하위 집합이며, 또는 URL 은 URI 의 일부라고 할 수 있습니다
二.HTTP 메서드
- GET: 리소스 취득
1.0/1.1 지원, 상용
- POST: 엔티티 본문 전송
1.0/1.1 지원, 상용
- PUT: 파일 전송
1.0/1.1 지원, 일반 웹사이트에서는 해당 방법을 사용하지 않습니다. PUT 메서드 자체에 인증 메커니즘이 없어 누구나 파일을 업로드할 수 있어 보안 문제가 존재하기 때문입니다
- HEAD: 메시지 헤더 취득
1.0/1.1 지원, 상용
- DELETE: 파일 삭제
1.0/1.1 지원, PUT 메서드와 동일한 문제 존재
- OPTIONS: 지원하는 메서드 문의
1.1 지원
- TRACE: 경로 추적
1.1 지원, Max-Forward 헤더 필드와 함께 경로를 검사
- CONNECT: 터널 프로토콜로 프록시에 연결 요구
1.1 지원, SSL(Secure Sockets Layer 보안 소켓 계층), TLS(Transport Layer Security 전송 계층 보안) 와 함께 터널로 TCP 통신을 구현
- (LINK): 리소스와의 연결 설정
1.0 지원, 1.1 에서 폐기
- (UNLINK): 연결 관계 단절
1.0 지원, 1.1 에서 폐기
三.HTTP 상태 코드
- 1XX: Informational(정보 상태 코드)
수신한 리クエスト를 처리 중
- 101: Switching Protocol, 프로토콜 전환, Upgrade 헤더 필드와 함께 프로토콜 전환을 요구, 그다지 일반적이지 않음
- 2XX: Success(성공 상태 코드)
리クエスト가 정상적으로 처리 완료
- 200: OK, 리クエスト이 정상적으로 처리
- 204: No Content, 리クエスト은 정상적으로 처리되었지만 반환할 리소스가 없음 (응답 본문이 공백)
- 206: Partial Content, 리クエスト의 일부 내용을 요구, 응답 헤더의 Content-Range 가 범위를 나타냄
- 3XX: Redirection(리디렉션 상태 코드)
리クエスト을 완료하기 위해 추가 작업이 필요
- 301: Moved Permanently, 영구 리디렉션, 브라우저는 자동으로 북마크를 업데이트해야 함
- 302: Found, 임시 리디렉션, 북마크를 업데이트하지 않음
- 303: See Other, 302 와 유사하지만, GET 메서드로 새로운 URL 에 액세스하도록 요구
주의: 사양에서는 301, 302 를 만나도 리クエスト 메서드를 변경하지 않는다 (원래 POST 면 계속 POST 사용) 고 규정하지만, *사실상의 표준*은 거의 모든 브라우저가 301, 302, 303 을 만나면 GET 메서드로 변경한다. 이는 사양과 일치하지 않음
- 304: Not Modified, 리소스를 찾았지만, 리クエスト 조건 (If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since) 을 만족하지 않음
주의: 304 는 3XX 에 속하지만, *리디렉션과는 관계없음*
- 307: Temporary Redirection, 임시 리디렉션, 302 와 같은 의미
사실상의 표준을 시정하기 위해 도입된 상태 코드, 302 를 엄격히 준수하여 메서드를 변경하지 않기를 바랐지만, 현재 브라우저는 반드시 그렇게 하지 않는다. 표준은 다시 실패
- 4XX: Client Error(클라이언트 오류 코드)
서버는 리クエスト을 처리할 수 없음
- 400: Bad Request, 리クエスト 메시지에 구문 오류 존재
- 401: Unauthorized, 인증이 필요함 (BASIC 인증 또는 DIGEST 인증) 또는 인증 실패를 나타냄
- 403: Forbidden, 특정 리소스에 대한 액세스 리クエスト이 거부됨
- 404: Not Found, 서버는 리クエスト된 리소스를 찾을 수 없음, 이유를 설명하고 싶지 않은 403 응답 대신 사용 가능
- 405: Method Not Allowed, 메서드 미지원, 그다지 일반적이지 않음
- 412: Precondition Failed, 전제 조건 실패, 그다지 일반적이지 않음
- 417: Expectation Failed, 기대 실패, 그다지 일반적이지 않음
- 5XX: Server Error(서버 오류 코드)
서버는 리クエスト 처리 중 오류 발생
-
500: Internal Server Error, 서버는 리クエスト 실행 중 오류 발생
-
503: Service Unavailable, 서버가 과부하 또는 유지 보수 중
四.HTTP 메시지 헤더
HTTP 메시지 헤더 = 메시지 헤더 + 공백 행 (CR+LF) + 메시지 본문
= 시작 행 (리クエスト 행/상태 행) + 헤더 + 공백 행 + 메시지 본문
= 시작 행 + 리クエスト/응답 헤더 필드 + 일반 헤더 필드 + 엔티티 헤더 필드 + 공백 행 + 메시지 본문
P.S.이*공백 행 (CR+LF)*을 가볍게 보아서는 안 됩니다. HTTP 헤더 인젝션 공격이 존재하는 이유는 이 공백 행이 있기 때문입니다
###1.시작 행
시작 행은 리クエスト 행과 상태 행으로 나뉩니다 (각각 HTTP 리クエスト 메시지와 응답 메시지에 해당):
-
리クエスト 행: 리クエスト에 사용하는 메서드, URI, HTTP 버전을 설명
-
상태 행: 반환하는 응답의 HTTP 버전과 상태 코드를 설명
###2.헤더 필드
| 헤더 필드명 | 설명 |
|---|---|
| Accept | 사용자 에이전트가 처리 가능한 미디어 타입 |
| Accept-Charset | 우선하는 문자 세트 |
| Accept-Encoding | 우선하는 콘텐츠 인코딩 |
| Accept-Language | 우선하는 언어 (자연어) |
| Authorization | Web 인증 정보 |
| Expect | 서버의 특정 동작을 기대 |
| From | 사용자의 이메일 주소 |
| Host | 리クエスト 리소스가 있는 서버 |
| If-Match | 엔티티 태그 (ETag) 비교 |
| If-Modified-Since | 리소스의 업데이트 시간 비교 |
| If-None-Match | 엔티티 태그 비교 (If-Match 와 반대) |
| If-Range | 리소스가 업데이트되지 않은 경우, 엔티티 Byte 의 범위 리クエスト 전송 |
| If-Unmodified-Since | 리소스의 업데이트 시간 비교 (If-Modified-Since 와 반대) |
| Max-Forwards | 최대 전송 홉 수 |
| Proxy-Authorization | 프록시 서버가 클라이언트에 요구하는 인증 정보 |
| Range | 엔티티의 바이트 범위 리クエスト |
| *Referer* | Web 인증 정보 |
| TE | 전송 인코딩의 우선순위 |
| User-Agent | HTTP 클라이언트 프로그램의 정보 |
| 헤더 필드명 | 설명 |
|---|---|
| Accept-Ranges | 바이트 범위 리クエスト을 받아들일지 여부 |
| Age | 리소스 생성부터의 경과 시간 추정 |
| ETag | 리소스의 매칭 정보 |
| Location | 클라이언트를 지정 URI 로 리디렉션 |
| Proxy-Authenticate | 프록시 서버의 클라이언트에 대한 인증 정보 |
| Retry-After | 다시 리クエスト을 전송하는 시기에 대한 요구 |
| Server | HTTP 서버의 설치 정보 |
| Vary | 프록시 서버 캐시의 관리 정보 |
| WWW-Authenticate | 서버의 클라이언트에 대한 인증 정보 |
| 헤더 필드명 | 설명 |
|---|---|
| Cache-Control | 캐시의 동작을 제어 |
| Connection | 홉바이홉 헤더, 연결의 관리 |
| Date | 메시지 생성의 일시 |
| Pragma | 메시지 지시 |
| Trailer | 메시지 말단의 헤더 일람 |
| Transfer-Encoding | 메시지 본문의 전송 인코딩 방식을 지정 |
| Upgrade | 다른 프로토콜로 업그레이드 |
| Via | 프록시 서버의 관련 정보 |
| Warning | 오류 알림 |
| 헤더 필드명 | 설명 |
|---|---|
| Allow | 리소스가 지원하는 HTTP 메서드 |
| Content-Encoding | 엔티티 본문에 적용하는 인코딩 방식 |
| Content-Language | 엔티티 본문의 자연어 |
| Content-Length | 엔티티 본문의 크기 (단위: 바이트) |
| Content-Location | 해당하는 리소스의 URI 를 대신함 |
| Content-MD5 | 엔티티 본문의 메시지 다이제스트 |
| Content-Range | 엔티티 본문의 위치 범위 |
| Content-Type | 엔티티 본문의 미디어 타입 |
| Expires | 엔티티 본문의 만료 일시 |
| Last-Modified | 리소스의 최종 수정 일시 |
P.S.기타 헤더 필드 및 더 자세한 헤더 필드 정보는 博客園:HTTP 메시지 참조
###참고 자료:
- 《도해 HTTP》
아직 댓글이 없습니다