====== HTTP ====== * HTTP1.1; RFC 2616 * 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 0.9; GET * HTTP 1.0; RFC 1945, 헤더 도입, GET 이외의 메서드 추가. * HTTP 1.1; RFC 2068, RFC 2616, HTTP 1.0의 기능에 더해 채널 전송, Accept 헤더에 의한 콘텐트 네고시에이션, 복잡한 캐시 컨트롤, 지속적 연결 등 추가. * 클라이언트/서버; Request / Response. Request-Response Style 프로토콜, HTTP는 동기형 Synchronous 프로토콜 * 클라이언트 - 요청 메시지 구축 - 요청 메시지 송신 - (응답이 돌아올 때까지 대기) - 응답 메시지 수신 - 응답 메시지 해석 - 클라이언트의 목적을 달성하기 위해 필요한 처리 * 서버 - (요청을 대기) - 요청 메시지 수신 - 요청 메시지 해석 - 적절한 애플리케이션 프로그램으로 처리를 위임 - 애플리케이션 프로그램으로부터 결과를 취득 - 응답 메시지 구축 - 응답 메시지 송신 ==== 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 .... * 스테이터스 라인 Status Line; 프로토콜 버전 HTTP/1.1, 스테이터스 코드 200, 텍스트 구문OK 으로 구성 * 헤더; MIME Multipurpose Internet Mail Extension 미디어 타입 application/xhtml+xml과 그 문자 인코딩 방식 utf-8 지정 * 바디; 헤더와 바디는 빈 줄로 구분 * HTTP 메시지의 구성 요소 ^ HTTP 메시지의 구조 ^ ^ 스타트 라인(Start Line) ^ ^ 헤더(Header) ^ ^ 빈 줄(blank Line) ^ ^ 바디(Body) ^ * HTTP의 스테이트리스성 * 애플리케이션 상태; Session State * 자기 기술적 메시지 Self Descriptive Message ==== HTTP 메서드 ==== ^ HTTP 메서드 ^^ ^ 메서드 ^ 의미 ^ | GET | 리소스 취득 | | POST | 서브 리소스의 작성, 리소스 데이터의 추가, 그 밖의 처리 | | PUT | 리소스 갱신, 리소스 작성 | | DELETE | 리소스 삭제 | | HEAD | 리소스의 헤더(메타 데이터) 취득 | | OPTIONS | 리소스가 서포트하는 메서드의 취득 | | TRACE | 자기 앞으로 요청 메시지를 반환(루프 백) 시험 | | CONNECT | 프록시 동작의 터널 접속으로 변경 | * CRUD 성질 충족; GET, POST, PUT, DELETE ^ CRUD와 HTTP 메서드의 대응 ^^^ ^ CRUD 명 ^ 의미 ^ 메서드 ^ | Create | 작성 | POST/PUT | | Read | 읽기 | GET | | Update | 갱신 | PUT | | Delete | 삭제 | DELETE | * GET - 리소스의 취득 * POST - 리소스의 작성, 추가 * PUT - 리소스의 갱신, 작성 * DELETE - 리소스의 삭제 * HEAD - 리소스의 헤더 취득 * OPTIONS - 리소스가 서포트하는 메서드의 취득 * POST를 PUT/DELETE 대신 사용하기도 한다 * _method 파라미터 * X-HTTP-Method-Override * 조건부 요청 Conditional Request; * 멱등성Idempotence과 안전성Safe ^ HTTP 메서드의 성질 ^^ ^ 메서드 ^ 성질 ^ | GET, HEAD | 멱등이고 안전하다 | | PUT, DELETE | 멱등이지만 안전하지 않다 | | POST | 멱등이지도 안전하지도 않다 | ==== 스테이터스 코드 ==== * 1xx; 처리중, 처리가 계속되고 있음을 나타낸다. 클라이언트는 그대로 요청을 계속하던지 서버의 지시에 따라 프로토콜을 업데이트 하여 재전송 * 2xx; 성공, 요청이 성공했음을 나타냄 * 3xx; 리다이렉트, 다른 리소스로의 리다이렉트를 나타낸다. 클아이언트는 이 스테이터스 코드를 받았을 때 응답메시지의 Location 헤더를 보고 새로운 리소스로 접속 * 4xx; 클라이언트 에러, 클라이언트 에러를 나타낸다. 원인은 클라이언트의 요청에 있다. 에러를 해결하지 않는 한, 정상적인 결과를 얻을 수 없기 때문에 같은 요청을 그대로 재전송할 수는 없다. * 5xx; 서버 에러, 서버 에러를 나타낸다. 원인이 서버에 있다. 서버 측의 원인이 해결되면, 동일한 요청을 재전송해서 정상적인 결과를 얻을 가능성이 있다 * 스테이터스 코드의 목록; IANA가 관리 http://j.mp/http_status_codes https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml * 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 - 서비스 정지 * 스테이터스 코드와 에러처리 * 프로토콜에 따른 포맷으로 에러른 반환 * Accept 헤더에 따른 포맷으로 에러를 반환 ==== HTTP 헤더 ==== * 전자메일의 메시지 스펙 RFC822의 헤더형식을 빌려오는 식으로 추가, 메일 프로토콜이 한 방향으로 주고 받지만 One-Way, HTTP는 한 번의 통신으로 요청/응답의 두 가지 메시지를 주고 받음 * 날짜와 시간 ^ 날짜 시간을 가지는 헤더 ^^^ ^ 이용하는 메시지 ^ 헤더 ^ 의미 ^ | 요청과 응답 | Date | 메시지를 생성한 일시 | | 요청 | If-Modified-Since | 조건부 GET으로 리소스의 갱신일시를 지정할 때 이용한다 | | ::: | If-Unmodified-Since | 조건부 PUT, 조건부 DELETE로 리소스의 갱신일시를 지정할 때 이용한다 | | 응답 | Expires | 응답을 캐시할 수 있는 기한 | | ::: | Last-Modified | 리소스를 마지막으로 생신한 일시 | | ::: | Retry-After | 다시 요청을 전송할 수 있는 일시의 기준 | * MIME 미디어 타입 * Content-Type - 미디어 타입 지정 ^ 타입 ^^^ ^ 타입 ^ 의미 ^ 예 ^ | 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 | * charset 파라미터 - 문자 인코딩을 지정 ^ 주요 서브타입 ^^ ^ 타입 / 서브타입 ^ 의미 ^ | 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 - 처리할 수 있는 언어를 전달 * Content-Length와 청크(chunk) 전송 * Content-Length - 바디의 길이를 지정 * 청크 전송 - 바디를 분할하여 전송 * 인증; Basic 인증, Digest 인증, 웹 API에서 WSSE WS-Security Extension 확장 스펙 * Basic 인증; 유저 이름과 패스워드를 Authorization 헤더에 넣어 요청마다 전송. 유저이름:패스워드를 Base64 인코딩, 보안 강도 확인 필요(SSL Secure Socket Layer, TLS Transport Layer Security, HTTPS HTTP over Secure Socket Layer 등) * Digest 인증; * 첼린지; nonce(number used once), qop(quality of protection) -> 'auth'나 'auth-init' 지정, opaque * 다이제스트 생성과 송신 * WSSE 인증; * OpenID와 OAuth, SSO Single Sign-on * OpenID - 심플한 싱글 사인온; IdP(Identity Provider), SP(Service Provide) * OAuth - 웹서비스 사이의 권한의 위임; 인가정보를 넘기는 기능 * 캐시 * 캐시용 헤더 * Pragma - 캐시를 억제 * Expires - 캐시의 유효기한 * Cache-Control - 상세한 캐시 방법을 지정 * 캐시용 헤더의 사용 구분 * 캐시를 시키지 않을 경우는 Pragma와 Cache-Control의 no-cache를 동시에 지정 * 캐시의 유효기간이 명확하게 정해저 있는 경우는 Expires를 지정 * 캐시의 유효기간을 상대적으로 지정하고자 하는 경우는 Cache-Control의 max-age로 상대시간을 지겅 * 조건부 GET * If-Modified-Since - 리소스의 갱신일시를 조건으로 한다 * If-None-Match - 리소스의 ETag(엔티티 태그)를 조건으로 한다 * 지속적 접속 Persistent Connection; Pipelining * 그 밖의 HTTP 헤더 * Content-Disposition - 파일명 지정 * Slug - 파일명과 힌트를 지정 ==== Status Codes ==== * HTTP 1.1(RFC2616), WebDAV(RFC4918) * 1xx; 처리중 * 100 Continue * 바디: 없음 * 관련 메서드: 모두 * 요청 헤더: Expect * 101 Switching Protocols * 바디: 없음 * 관련 메서드: 모두 * 요청 헤더: Upgrade * 2xx; 성공 * 200 OK * 바디: GET의 경우는 리소스의 표현, 그 밖의 메서드의 경우는 처리 결과 * 관련 메서드: 모두 * 201 Created * 바디: 신규 작성된 리소스의 표현, 혹은 처리결과의 설명 * 관련 메서드: POST, PUT * 요청 헤더: Location * 202 Accepted * 바디: 처리 결과를 얻을 수 있는 리소스의 링크와 예상처리 시간 * 관련 메서드: 모두 * 요청 헤더: Location, Retry-After * 203 Non-Authoritative Information * 바디: GET의 경우는 리소스의 표현, 그 밖의 메서드의 경우는 처리 결과 * 관련 메서드: 모두 * 204 No Content * 바디: 없음 * 관련 메서드: POST, PUT, DELETE * 205 Reset Content * 바디: 없음 * 관련 메서드: 모두 * 206 Partial Content * 바디: 지정된 범위의 리소스 표현 * 관련 메서드: GET * 요청 헤더: Range, If-Range * 응답 헤더: Content-Range * 207 Multi-Status * 바디: WebDAV가 정의하는 멀티 스테이터스를 표현하는 XML 문서 * 관련 메서드: POST * 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 * 바디: 후보 URI 리스트 * 관련 메서드: 모두 * 요청 헤더: Accept, Accept-Charset, Accept-Language, Accept-Encoding, Accept-Range * 407 Proxy Authentication Required * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: 모두 * 요청 헤더: Proxy-Authorization * 응답 헤더: Proxy-Authenticate * 408 Request Timeout * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: 모두 * 응답 헤더: Connection * 409 Conflict * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: PUT, POST, DELETE * 응답 헤더: Location * 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 * 414 Request-URI Too Long * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: 모두 * 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 * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: PUT, COPY, MOVE, LOCK * 424 Failed Dependency * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: 모두 * 5xx; 서버 에러 * 500 Internal Server Error * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: 모두 * 501 Not Implemented * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: 모두 * 502 Bad Gateway * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: 모두 * 503 Service Unavailable * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: 모두 * 응답 메서드: Retry-After * 504 Gateway Timeout * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: 모두 * 505 HTTP Version Not Supported * 바디: 에러의 이유를 설명하는 문서 * 관련 메서드: 모두 ==== HTTP Headers ==== * 서버 정보 * Date * 이용하는 메시지: 요청, 응답 * 값: 일시 * Retry-After * 이용하는 메시지: 응답 * 값: 일시 또는 수치(초) * 관련 스테이터스 코드: 202 Accepted, 503 Service Unavailable * Server * 이용하는 메시지: 응답 * 값: 서버 소프트웨어의 명칭과 버전 * Set-Cookie * 이용하는 메시지: 응답 * 값: 문자열 * Cookie의 스펙 RFC2965 * 클라이언트 정보 * Cookie * 이용하는 메시지: 요청 * 값: 문자열 * Expect * 이용하는 메시지: 요청 * 값: 100-continue * 관련 스테이터스 코드: 100 Continue, 417 Expectation Failed * From * 이용하는 메시지: 요청 * 값: 메일 주소 * Referer * 이용하는 메시지: 요청 * 값: URI * User-Agent * 이용하는 메시지: 요청 * 값: 클라이언트 소프트웨어의 명칭과 버전 * 리소스 정보 * Content-Encoding * 이용하는 메시지: 요청, 응답 * 값: 압축방식 * Content-Language * 이용하는 메시지: 요청, 응답 * 값: 언어 태그 * Content-Length * 이용하는 메시지: 요청, 응답 * 값: 10진수 값(바이트) * Content-MD5 * 이용하는 메시지: 요청, 응답 * 값: MD5 해시값 * Content-Type * 이용하는 메시지: 요청, 응답 * 값: 미디어 타입 * Content-Location * 이용하는 메시지: 응답 * 값: URI * Last-Modified * 이용하는 메시지: 응답 * 값: 일시 * Location * 이용하는 메시지: 응답 * 값: URI * Host * 이용하는 메시지: 요청 * 값: 호스트명과 포트번호 * 콘텐트 네고시에이션 * Accept * 이용하는 메시지: 요청 * 값: 미디어 타입의 우선도 * 관련 스테이터스 코드: 300 Multiple Choices, 406 Not Acceptable * Accept-Charset * 이용하는 메시지: 요청 * 값: 문자 인코딩의 우선도 * 관련 스테이터스 코드: 300 Multiple Choices, 406 Not Acceptable * Accept-Encoding * 이용하는 메시지: 요청 * 값: 압축방식의 우선도 * 관련 스테이터스 코드: 300 Multiple Choices, 406 Not Acceptable * Accept-Language * 이용하는 메시지: 요청 * 값: 언어 태그의 우선도 * 관련 스테이터스 코드: 300 Multiple Choices, 406 Not Acceptable * Vary * 이용하는 메시지: 응답 * 값: Accept-* 헤더의 리스트 * 조건부 요청 * ETag * 이용하는 메시지: 응답 * 값: Etag의 값을 나타내는 문자열 * If-None-Match * 이용하는 메시지: 요청 * 값: ETag * 관련 메서드: GET * If-Modified-Since * 이용하는 메시지: 요청 * 값: 일시 * 관련 메서드: GET * If-Match * 이용하는 메시지: 요청 * 값: ETag * 관련 메서드: PUT, DELETE * 관련 스테이터스 코드: 412 Precondition Failed * If-Unmodified-Since * 이용하는 메시지: 요청 * 값: 일시 * 관련 메서드: PUT, DELETE * 관련 스테이터스 코드: 412 Precondition Failed * 부준적 GET * Range * 이용하는 메시지: 요청 * 값: 취득하고 싶은 부분(바이트) * 관련 메서드: GET * If-Range * 이용하는 메시지: 요청 * 값: ETag 또는 일시 * 관련 메서드: GET * Accept-Range * 이용하는 메시지: 응답 * 값: bytes 또는 none * 관련 메서드: GET, HEAD * 관련 스테이터스 코드: 206 Partial Content * Content-Range * 이용하는 메시지: 응답 * 값: 바이트 폭 * 관련 메서드: GET * 관련 스테이터스 코드: 206 Partial Content * 캐시 * Pragma * 이용하는 메시지: 요청, 응답 * 값: no-cache * Cache-Control * 이용하는 메시지: 요청, 응답 * 값: 스펙에서 정해진 컨트롤 식별자 no-cache, max-age: xxxx 등 * Expires * 이용하는 메시지: 응답 * 값: 일시 * Age * 이용하는 메시지: 응답 * 값: 경과시간(초) * 인증 * WWW-Authenticate * 이용하는 메시지: 응답 * 값: 인증방식 * 관련 스테이터스 코드: 401 Unauthorized * Authorization * 이용하는 메시지: 요청 * 값: 인증방식 * 관련 스테이터스 코드: 401 Unauthorized * Proxy-Authenticate * 이용하는 메시지: 응답 * 값: 인증방식 * 관련 스테이터스 코드: 407 Proxy Authentication Required * Proxy-Authorization * 이용하는 메시지: 요청 * 값: 인증방식 * X-WSSE * 이용하는 메시지: 요청 * 값: 인증방식 * 청크 전송 * Transfer-Encoding * 이용하는 메시지: 요청, 응답 * 값: chunked * Trailer * 이용하는 메시지: 응답 * 값: 헤더명 리스트 * TE * 이용하는 메시지: 요청 * 값: trailer * 기타 * Allow * 이용하는 메시지: 응답 * 값: 메서드 리스트 * 관련 메서드: OPTIONS * 관련 스테이터스 코드: 405 Method Not Allowed * Connection * 이용하는 메시지: 응답, 요청 * 값: close * Max-Forward * 이용하는 메시지: 요청 * 값: 수치(횟수) * 관련 메서드: TRACE, OPTIONS * Upgrade * 이용하는 메시지: 요청, 응답 * 값: 프로토콜 리스트 * 관련 스테이터스 코드: 101 Switching Protocols * Via * 이용하는 메시지: 요청, 응답 * 값: 중개자의 호스트명, 포트번호, 프로토콜 버전 * Warning * 이용하는 메시지: 응답 * 값: 에러 코드와 텍스트 구문 * Content-Disposition * 이용하는 메시지: 요청, 응답 * 값: 문자열 * Slug * 이용하는 메시지: 요청 * 값: %인코딩한 문자열 * 관련 메서드: POST * X-HTTP-Override * 이용하는 메시지: 요청 * 값: HTTP 메서드밍 * 관련 메서드: POST ===== References ===== * [[https://developer.mozilla.org/ko/docs/Web/HTTP|HTTP 자습서]]