This is an old revision of the document!
HTTP
-
Uniform 인터페이스, 스테이트리스 서버, 캐시 등을 구현하고 있는 Web의 기반 프로토콜
TCP/IP 기반 Transmission Control Protocol / Internet Protocol
계층형 프로토콜
네트워크 인터페이스 계층
인터넷 계층; IP에 해당, 기본단위 패킷Packet
트랜스포트 계층; TCP에 해당, 커넥션 연결을 사용해 데이터의 누락 체크, 데이터의 도달 보증, 포트번호 1~65535, HTTP의 디폴트 80번.
애플리케이션(응용) 계층; 메일,
DNS, HTTP를 실현,
| 계층형 프로토콜 |
| 애플리케이션 계층 | HTTP, NTP, SSH, SMTP, DNS |
| 트랜스포트 계층 | UDP, TCP |
| 인터넷 계층 | IP |
| 네트워크 인터페이스 계층 | 이더넷 |
HTTP 메시지
요청 메시지
GET /test HTTP/1.1
Host: example.com
요청라인 Request-Line; 메서드 GET, 요청
URI/test, 프로토콜 버전
HTTP/1.1로 구성
헤더; 이름:값 구성
바디;
응답 메시지
HTTP/1.1 200 OK
Content-Type: application/xhtml+xml; charset=utf-8
<html xmlns="http://www.w3.org/1999/xhtml">
....
</html>
-
| HTTP 메시지의 구조 |
| 스타트 라인(Start Line) |
| 헤더(Header) |
| 빈 줄(blank Line) |
| 바디(Body) |
HTTP 메서드
| HTTP 메서드 |
| 메서드 | 의미 |
| GET | 리소스 취득 |
| POST | 서브 리소스의 작성, 리소스 데이터의 추가, 그 밖의 처리 |
| PUT | 리소스 갱신, 리소스 작성 |
| DELETE | 리소스 삭제 |
| HEAD | 리소스의 헤더(메타 데이터) 취득 |
| OPTIONS | 리소스가 서포트하는 메서드의 취득 |
| TRACE | 자기 앞으로 요청 메시지를 반환(루프 백) 시험 |
| CONNECT | 프록시 동작의 터널 접속으로 변경 |
| CRUD와 HTTP 메서드의 대응 |
| CRUD 명 | 의미 | 메서드 |
| Create | 작성 | POST/PUT |
| Read | 읽기 | GET |
| Update | 갱신 | PUT |
| Delete | 삭제 | DELETE |
| HTTP 메서드의 성질 |
| 메서드 | 성질 |
| GET, HEAD | 멱등이고 안전하다 |
| PUT, DELETE | 멱등이지만 안전하지 않다 |
| POST | 멱등이지도 안전하지도 않다 |
스테이터스 코드
1xx; 처리중, 처리가 계속되고 있음을 나타낸다. 클라이언트는 그대로 요청을 계속하던지 서버의 지시에 따라 프로토콜을 업데이트 하여 재전송
2xx; 성공, 요청이 성공했음을 나타냄
3xx; 리다이렉트, 다른 리소스로의 리다이렉트를 나타낸다. 클아이언트는 이 스테이터스 코드를 받았을 때 응답메시지의 Location 헤더를 보고 새로운 리소스로 접속
4xx; 클라이언트 에러, 클라이언트 에러를 나타낸다. 원인은 클라이언트의 요청에 있다. 에러를 해결하지 않는 한, 정상적인 결과를 얻을 수 없기 때문에 같은 요청을 그대로 재전송할 수는 없다.
5xx; 서버 에러, 서버 에러를 나타낸다. 원인이 서버에 있다. 서버 측의 원인이 해결되면, 동일한 요청을 재전송해서 정상적인 결과를 얻을 가능성이 있다
200 OK - 요청 성공
201 Created - 리소스 작성 성공
301 Moved Permanently - 리소스의 항구적인 이동
303 See Other - 다른 URI의 참조
400 Bad Request - 요청 오류
401 Unauthorized - 접근 권한 없음, 인증 실패
404 Not Found - 리소스 없음
500 Internal Server Error - 서버 내부 에러
503 Service Unavailable - 서비스 정지
HTTP 헤더
| 날짜 시간을 가지는 헤더 |
| 이용하는 메시지 | 헤더 | 의미 |
| 요청과 응답 | Date | 메시지를 생성한 일시 |
| 요청 | If-Modified-Since | 조건부 GET으로 리소스의 갱신일시를 지정할 때 이용한다 |
| If-Unmodified-Since | 조건부 PUT, 조건부 DELETE로 리소스의 갱신일시를 지정할 때 이용한다 |
| 응답 | Expires | 응답을 캐시할 수 있는 기한 |
| Last-Modified | 리소스를 마지막으로 생신한 일시 |
| Retry-After | 다시 요청을 전송할 수 있는 일시의 기준 |
| 타입 |
| 타입 | 의미 | 예 |
| text | 사람이 읽고 직접 이해할 수 있는 텍스트 | text/plain |
| image | 그림 데이터 | image/jpeg |
| audio | 음성 데이터 | audio/mpeg |
| video | 동영상 데이터 | video/mp4 |
| application | 그 밖의 데이터 | application/pdf |
| multipart | 복수의 데이터로 이루어진 복합 데이터 | multipart/related |
| message | 전자메일 메시지 | message/rfc822 |
| model | 복수 차원으로 구성하는 모델 데이터 | model/vrml |
| example | 예시용 | example/foo-bar |
| 주요 서브타입 |
| 타입 / 서브타입 | 의미 |
| text/plain | 플레인 텍스트 |
| text/csv | CSV형식 텍스트 |
| text/css | CSS형식의 스타일 시트 |
| text/html | HTML 문서 |
| text/xml | XML 문서(비추천) |
| image/jpeg | JPEG 이미지 |
| image/gif | GIF 이미지 |
| image/png | PNG 이미지 |
| application/xml | XML 문서 |
| application/xhtml+xml | XHTML 문서 |
| application/atom+xml | Atom 문서 |
| application/atomsvc+xml | Atom의 서비스 문서 |
| application/atomcat+xml | Atom의 카테고리 문서 |
| application/javascript | JavaScript |
| application/json | JSON 문서 |
| application/msword | Word 문서 |
| application/vnd.ms-excel | Excel 문서 |
| application/vns.ms-powerpoint | PowerPoint 문서 |
| application/pdf | PDF 문서 |
| application/zip | ZIP 파일 |
| application/x-shockware-flash | Flash 오브젝트 |
| application/x-www-form-urlencoded | HTML 폼 형식 |
언어 태그Language Tag; Content-Language 헤더,
RFC 4646 언어 태그
RFC 4647 태그의 비교방법이 정의
콘텐트 네고시에이션
Accept - 처리할 수 있는 미디어 타입을 전달
Accept-Charset - 처리할 수 있는 문자 인코딩 전달
Accept-Language - 처리할 수 있는 언어를 전달
Status Codes
HTTP 1.1(RFC2616), WebDAV(RFC4918)
1xx; 처리중
100 Continue
바디: 없음
관련 메서드: 모두
요청 헤더: Expect
101 Switching Protocols
바디: 없음
관련 메서드: 모두
요청 헤더: Upgrade
2xx; 성공
3xx; 리다이렉트
300 Multiple Choices
바디: 후보 URI의 리스트
관련 메서드: 모두
301 Moved Permanently
바디: 이동할 곳의
URI 링크를 포함한
HTML 등
관련 메서드: 모두
응답 헤더: Location
302 Found
바디: 이동할 곳의
URI 링크를 포함한
HTML 등
관련 메서드: POST
응답 헤더: Location
303 See Other
바디: 이동할 곳의
URI 링크를 포함한
HTML 등
관련 메서드: POST
응답 헤더: Location
304 Not Modified
바디: 없음
관련 메서드: GET
요청 헤더: If-Modified-Since, If-None-Match
응답 헤더: ETag, Last-Modified
305 Use Proxy
바디: 프록시가 필요하다는 것을 설명하는
HTML 등
관련 메서드: 모두
응답 헤더: Location
307 Temporary Redirected
바디: 이동할 곳의
URI 링크를 포함한
HTML 등
관련 메서드: 모두
응답 헤더: Location
4xx; 클라이언트 에러
400 Bas Request
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
401 Unauthorized
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
요청 헤더: Authorization
응답 헤더: WWW-Authenticate
402 Payment Required
바디: 결제방식을 설명하는 문서
관련 메서드: 모두
403 Forbidden
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
404 Not Found
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
405 Method Not Allowed
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
응답 헤더: Allow
406 Not Acceptable
-
관련 메서드: 모두
요청 헤더: Accept, Accept-Charset, Accept-Language, Accept-Encoding, Accept-Range
407 Proxy Authentication Required
408 Request Timeout
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
응답 헤더: Connection
409 Conflict
410 Gone
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
411 Length Required
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
요청 헤더: Content-Length
412 Precondition Failed
바디: 에러의 이유를 설명하는 문서
관련 메서드: PUT, POST
요청 헤더: If-Match, If-None-Match, If-Unmodified-Since
응답 헤더: ETag, Last-Modified
413 Request Entity Too Large
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
응답 헤더: Connection
-
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
415 Unsupported Media Type
바디: 에러의 이유를 설명하는 문서
관련 메서드: PUT, POST
요청 헤더: Content-Type
416 Requested Range Not Satisfiable
바디: 에러의 이유를 설명하는 문서
관련 메서드: GET
요청 헤더: Range
417 Expectation Failed
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
요청 헤더: Expect
422 Unprocessable Entity
바디: 에러의 이유를 설명하는 문서
관련 메서드: POST, PUT
423 Locked
424 Failed Dependency
바디: 에러의 이유를 설명하는 문서
관련 메서드: 모두
5xx; 서버 에러
서버 정보
Date
Retry-After
Server
이용하는 메시지: 응답
값: 서버 소프트웨어의 명칭과 버전
Set-Cookie
이용하는 메시지: 응답
값: 문자열
Cookie의 스펙 RFC2965
클라이언트 정보
Cookie
Expect
From
Referer
User-Agent
이용하는 메시지: 요청
값: 클라이언트 소프트웨어의 명칭과 버전
리소스 정보
Content-Encoding
Content-Language
이용하는 메시지: 요청, 응답
값: 언어 태그
Content-Length
이용하는 메시지: 요청, 응답
값: 10진수 값(바이트)
-
Content-Type
이용하는 메시지: 요청, 응답
값: 미디어 타입
Content-Location
Last-Modified
Location
Host
이용하는 메시지: 요청
값: 호스트명과 포트번호
콘텐트 네고시에이션
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Vary
이용하는 메시지: 응답
값: Accept-* 헤더의 리스트
조건부 요청
ETag
이용하는 메시지: 응답
값: Etag의 값을 나타내는 문자열
If-None-Match
이용하는 메시지: 요청
값: ETag
관련 메서드: GET
If-Modified-Since
이용하는 메시지: 요청
값: 일시
관련 메서드: GET
If-Match
If-Unmodified-Since
부준적 GET
Range
이용하는 메시지: 요청
값: 취득하고 싶은 부분(바이트)
관련 메서드: GET
If-Range
이용하는 메시지: 요청
값: ETag 또는 일시
관련 메서드: GET
Accept-Range
Content-Range
캐시
Pragma
이용하는 메시지: 요청, 응답
값: no-cache
Cache-Control
Expires
Age
인증
WWW-Authenticate
Authorization
Proxy-Authenticate
Proxy-Authorization
X-WSSE
청크 전송
Transfer-Encoding
이용하는 메시지: 요청, 응답
값: chunked
Trailer
TE
기타
Allow
Connection
이용하는 메시지: 응답, 요청
값: close
Max-Forward
이용하는 메시지: 요청
값: 수치(횟수)
관련 메서드: TRACE, OPTIONS
Upgrade
Via
Warning
이용하는 메시지: 응답
값: 에러 코드와 텍스트 구문
Content-Disposition
Slug
이용하는 메시지: 요청
값: %인코딩한 문자열
관련 메서드: POST
-
이용하는 메시지: 요청
-
관련 메서드: POST
References