HTTP란?
TCP/IP 4계층에서 애플리케이션에 해당하는 프로토콜로서, 전송 계층에서 TCP를 사용하여 웹 브라우저와 웹 서버간에 통신하는 프로토콜이다.
특징
-
무연결(Connectionless)
HTTP는 연결을 유지하지 않은 상태로 데이터를 주고 받을 수 있다. HTTP는 클라이언트로부터 요청이 들어와 서버가 응답하면 클라이언트와 서버의 연결을 끊고, 클라이언트가 새로 요청하면 또 다른 연결을 맺는다.
-
무상태(Stateless)
HTTP는 무연결 특징이 있어서 요청이 있을 때마다 독립적인 트랜잭션으로 취급하기 때문에 이전 연결에서 작업했던 내용을 다음 요청에서 그대로 사용할 수 없다. 이처럼 요청마다 서로 다른 연결로 인식되어 요청 간에 정보를 공유해서 사용할 수 없는 상태로 즉, 상태정보가 유지되지 않는 특성을 무상태(Stateless)라고 한다.
그래서 이전 연결의 상태전보를 계속 사용하고 싶다면, 서버나 클라이언트 측에 정보를 저장해두고 사용해야 한다.
-
요청/응답 (Request/Response)
클라이언트가 서비스를 요청하면 서버는 요청 정보를 받고 요청을 처리한 후에 응답하여 통신이 이루어진다.
HTTP 요청 정보
HTTP의 요청정보는 헤더와 바디로 구성되며,
헤더의 가장 첫 번째 줄은 Request-Line 으로 요청방식, 요청한 페이지에 대한 정보인 URI, 요청 시 사용한 HTTP버전 정보가 들어간다.
Request-Line 이후 공백 행이 삽입되며 다음 줄부터 헤더 정보이다.
헤더 정보는 name : content 형식으로 정보가 들어가며, 서비스 처리를 위한 웹 클라이언트와 웹서버간의 공유할 정보들이다.
헤더 정보가 끝난 뒤에는 웹 클라이언트가 웹서버에 보내는 데이터가 바디에 구성된다.
HTTP 요청방식
-
GET
웹서버에 GET방식으로 서비스를 요청하는 경우는 URL을 직접 입력하거나, 하이퍼링크가 포함된 개체를 클릭할때 이다. 또는 직접 GET방식을 지정하여 서비스를 요청할 수 있다.
GET방식의 요청은 캐시(cache)가 가능하며, 클라이언트가 서버로 전송하는 문자열이 있을 때는 요청정보 헤더에 요청 줄에 포함되는 URI 뒤에 ? 기호화 함께 추가되어 전달된다. -> 클라이언트에서 서버로 보내는 문자열 정보들이 웹 브라우저에 노출되는 특징이 있다.
-
POST
POST방식은 데이터가 HTTP 요청정보의 바디에 포함되어 전달된다. 따라서 데이터 크기에 제한이 없고, 화면에 노출되지 않는다. POST 방식은 주로 서버 측의 정보를 새로 생성하는 작업에 사용된다.
-
PUT
PUT 방식의 서비스 요청은 서버의 리소스를 수정할 때(UPDATE) 사용한다.
-
DELETE
서버의 리소스를 삭제하는 작업을 요청할 때 사용하는 방식.
요청 URI
요청 URI는 웹 클라이언트가 웹서버에 요청한 서비스 문서의 정보이다. 요청 URI는 네트워크의 자원정보인 URL의 일부이며,
URI는 프로토콜 / 서버주소 / 포트번호 / 서버자원정보(Request-URI) 형식을 갖고 있다.
- 프로토콜
프토콜은 서버와 통신하기 위한 규약으로서 서버마다 사용하는 프로토콜이 정해져 있다.예를 들어, 웹서버는 URL에 HTTP:// 로 표현하며, 오라클 DBMS는 jdbc:oracle:thin:@으로 표현한다.
- 서버 주소
네트워크상에서 연결된 컴퓨터를 찾아가기 위한 정보로서 IP주소 또는 도메인 이름으로 표현한다.
- 포트 번호
URL에서 서버 주소를 이용해 컴퓨터를 찾았다면, 포트 번호는 컴퓨터에서 동작하고 있는 서버로 접속하기 위한 정보이다.
포트 번호는 0~65,535번까지 사용할 수 있으며, 0~1,023사이의 번호는 well-known port로서 이미 사용이 정의되어 있다.
- URI
URI는 서버에서 서비스하는 서버의 자원 정보이다.
헤더
헤더는 name : content 형식으로 정보가 표현되며, content 부분의 값들은 공백이나 탭으로 구분된다.
요청정보의 헤더 필드
- Accept : text/html, application/xhtml_xml 등
클라이언트가 인식하여 처리할 수 있는 파일 타입을 명시한다.
- Accept-Encoding : gzip, deflate, sdch
compress 또는 gzip과 같은 웹 클라이언트가 받아들일 수 있는 인코딩 방식을 지정한다. 여러 개의 인코딩 방식을 쉼표(,)로 구분하여 나열한다. 인코딩 형태를 지정하지 않으면 클라이언트에 어떤 형태도 받아들여지지 않는다.
- Accept-Language : ko-KR, kp:q=0.8
클라이언트가 지원하는 언어를 지정한다.
- User-Agent:
클라이언트가 사용하는 웹 브라우저에 대한 정보를 보여준다. 서버 쪽에서는 User-Agent 정보를 보고 일반 웹페이지와 모바일 웹페이지로 자동 분기한다.
- Cache-Control : no-cache, no-store, max-age
HTTP 캐시는 클라이언트가 서버에 요청하여 응답받은 서비스 결과를 클라이언트 쪽에 저장했다가 사용자로부터 같은 서비스 요청이 들어오면 이전에 저장된 처리결과를 보여주는 것이다.
no-cache : 캐시 안함
no-store : 신속히 넘긴 후 정보 제거
max-age=seconds : 지정된 시간보다 오래된 데이터는 캐시 안 함.
max-stale=seconds : 지정된 시간이 아직 되지 않은 만료된 데이터를 보냄.
min-fresh=seconds : 지정된 시간 이후의 변경된 새로운 데이터만 보냄.
only-if-cached : 새로운 데이터를 검색하지 않고 캐시에 있는 데이터만 반환
HTTP 응답정보
HTTP 응답정보는 응답 상태 라인, 헤더, 바디로 구성되며
응답정보의 상태 라인은
HTTP 버전(서버가 응답하기 위해 사용하는 버전 정보), 상태 코드(Statu-Code), 상태 코드 설명(Reason-Phrase)로 구성되어 있다.
상태 코드
상태 코드는 클라이언트의 요청에 대한 처리 결과를 의미한다.
-
1XX : 조건부 응답
-
2XX : 성공
- 200 ok
클라이언트의 요청을 성공적으로 처리했음을 의미, 서버는 요청한 데이터를 포함하여 응답한다.
-
3XX : 리다이렉션 완료
-
4XX : 요청 오류
- 400 Bad Request
클라이언트의 요청에 문법적인 오류 등 잘못된 요청으로 서버가 요청을 해석할 수 없는 경우
- 401 Unauthorized
인증오류로서 클라이언트가 잘못된 인증 정보를 Authorization 헤더에 넣었음을 나타낸다.
- 403 Forbidden
사용자 권한 오류로서 클라이언트의 인증 정보에 상관없이 페이지에 대한 접근을 거부한다.
- 404 Not Found
클라이언트가 요청한 문서가 존재하지 않음을 의미한다. 클라이언트 요청에 대하여 서비스하는 요청 URI를 서버가 찾지 못한 경우이다.
- 405 Method Not Allowed
클라이언트가 요청한 서비스 요청방식을 웹서버에서 지원하지 않음을 의미한다. 이런 경우는 요청한 서비스 요청방식을 확인한 후 서버 프로그램에서 해당 요청방식 처리 메소드가 구현되었는지 확인
- 5XX : 서버 오류
- 500 Internal Server Error
서버 프로그램 실행시 오류가 발생하여 서버 프로그램이 실행을 멈추었거나 올바르지 않은 응답 헤더 정보가 설정되었을 때 발생한다.
헤더
응답 상태 라인 다음줄에 위치하며, 클라이언트 서비스 요청에 대한 실행 결과를 웹 클라이언트가 올바르게 처리할 수 있게 하기 위한 정보들로 구성된다.
요청정보의 헤더 필드
- Cache-Control : public, private, no-cache, no-transform, must-revalidate, proxy-revalidate
HTTP1.1 버전에서 지원하는 헤더로서 응답 결과를 캐시에 저장할지에 대한 내용을 나타낸다.
public : 어떠한 캐시라도 캐시할 수 있음
private : 공유된 캐시는 캐시하지 않음
no-cache : 캐시하지 않음
no-transform : 데이터를 변환하지 않음
must-revalidate : 클라이언트는 데이터를 재확인해야 함
proxy-revalidate : 개인적인 클라이언트 캐시를 제외하고 데이터를 재확인 해야 함.
- Connection
연결을 위해 지정하는 정보로서 close연결은 클라이언트나 서버 둘 중 하나가 연결을 해제하기 원한다는 것을 알린다.
- Content-Encoding
메세지를 전송할 때 사용할 인코딩 체계를 지정
- Content-type : text/html; charset=UTF-8
클라이언트가 요청한 메시지의 데이터 포맷으로서 서버도 같은 데이터 타입으로 처리하여 응답해야 한다.
- Date
웹서버가 클라이언트에 응답한 날짜와 시간을 표시한다.
- Server
클라이언트의 서비스 요청을 받아서 서비스를 처리한 서버의 이름과 버전 정보를 나타낸다.