본문 바로가기

[Network] HTTP란? / REST API란? - '기본개념'

HTTP / REST API '기본개념' 

HTTP란? REST / REST API란? 

HTTP패킷 / Header / Body 등 기본개념 익히기

HTTP

 

HTTP란?

: HyperText Transper Protocol, 링크기반(URL)으로 데이터를 요청하고 받겠다는 통신 규약(Protocol)

HTML / 이미지 / 오디오 / 텍스트 문서같은 리소스들을 서버로부터 통신을 가능하게 만드는 프로토콜

 

HTTP 동작방식

클라이언트 'Client' - 웹 브라우저(크롬,IE,파폭 등)를 통해 URL을 이용해 서버에 요청(Request)

서버 'Server' - 클라이언트로부터 받은 요청을 내부로직 처리 후 결과를 클라이언트에게 응답(Response) 

 

     * URI - 프로토콜 + 도메인 + URI 

              ex) "https://github.com/posth2071/repository"

 

URI? URL?

: URI (Uniform Resource Identifier) - 통합 자원 식별자, 인터넷에 있는 자원(리소스)의 유일한 주소

URL (Uniform Resource Locator) - 파일 리소스의 위치, 네트워크 상의 위치

ex) http://github.com/ -> URL (프로토콜 + 도메인,네트워크 상 위치)

ex) https://github.com/userid/test.txt -> URI, sample.com서버의 userid폴더에 test.txt파일 (유일성)

-> URI (URL + Resource PATH), URI가 URL보다 상위개념

 

HTTP 특징 / 기능

1) 비연결성 (Connectless) + 비상태성 (Stateless)

 : 1번 요청-1번 응답 후 연결 해제 (일회성, Connectless)

   클라이언트의 이전 상태를 알 수 없음 (비상태성, Stateless) -> 쿠키/세션으로 이전 정보 저장

   수많은 클라이언트들이 서버로 요청(Request)하더라도 최소유지 가능(장점) 

2) Keep-Alive : HTTP/1.1 부터 지원하는 기능

 : HTTP의 비연결성(1번의 연결-응답)을 극복위한 기능

   지정된 시간동안 연결상태 유지

    keep-alive timeout, 시간안에 클라이언트 재요청시 기존 연결을 이용

 

HTTP 요청(Request) 패킷 구조

: 요청(Request)은 클라이언트 -> 서버로 보내는 메시지

Request 구조

Request Line (요청 라인) : 요청 방식(Method) / URI / HTTP 버전 등

Header : 사용자 정보 (클라이언트 정보, 요청Body 데이터타입, 응답Body 타입, 문자코드 등)

공백 (White Space) : 헤더(Header)와 Body의 구분을 위한 공백

Body : HTTP Request 요청 메시지(Data)를 담고 있는 부분

     : GET 메소드일 경우, 요청URL에 모두 표현하기에 Body는 빈공간 

 

 

 

HTTP 응답(Response) 패킷 구조

: 응답(Response)은 서버 -> 클라이언트로 보내는 메시지

Response 구조

Stateus Line (상태 라인) : 요청에 대한 처리결과 (HTTP버전 / 응답코드 / 응답메시지 등)

Header :  사용자에게 전달한 응답 데이터 정보 (데이터 타입, 데이터 길이 등) 

공백 (White Space) :헤더(Header)와 Body의 구분을 위한 공백

Body : 요청에 대한 응답데이터, 사용자에게 전달할 데이터 실제 내용 '페이로드'

 

HTTP HEADER '헤더'

: HTTP 요청, 응답 + 리소스(자원&데이터)에 대한 메타데이터 전달 역할

 

요청 헤더 'Request Header'

  1) Accept

        : 응답 데이터(Response Body) 타입을 명시

GET /magna-opus HTTP/1.1
Host : example.org
Accept: text/html, application/xhtml+xml, application/xml; q=0.9, */*; p=0.8

            magna-opus 리소스에 대해 기본적으로 응답 데이터타입을 최선책으로 html & xhtml타입 희망,

            차선책으로는 xml, 그 후 차선책은 모든 응답(*/*)의 의미

            q는 선호도 의미 (생략시 1값 디폴트)

 

  2) Accept-Charset

        : 응답 데이터(Response Body) 캐릭터셋 명시 헤더

Accept-Charset: iso-8859-5, unicode-1-1; q=0.8

       iso-8859-5를 최선 희망, 차선책으로 unicode-1-1 의미

           

  3) User-Agent

        : 현재 요청을 보낸 클라이언트의 Agent 정보 표시용도

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0

파이어폭스 버전 21.0의 UA스트링, OS에 대한 정보도 담겨져있다.

 

  4) Referer

       : 해당 요청을 보내기 바로 직전 참조하던 리소스 혹은 주소에 대한 정보 나타내는 용도

Referer: http://en.wikipedia.org/wiki/Main_Page

 

 

응답 헤더 'Response Header'

  1) Content-Length

        : 요청과 응답 메시지(Body, 데이터)의 크기(길이) 나타내는 용도, 단위 바이트(Byte)

Content-Length: 348
// Body 데이터 크기(길이) 348 Byte

 

  2) Last-Modified

       : 해당 리소스가 마지막 갱신된 시간 나타내는 용도

         캐싱 정책과 관련하여 중요한 헤더 중 하나

Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT

 

HTTP Method - 데이터의 CRUD 담당 메서드

1) GET

 : CRUD의 Read(조회), URI에 해당하는 정보의 조회

2) POST

 : CRUD의 Create(생성), 서버 내에 데이터를 생성

3) PUT

 : CRUD의 Update(변경), 자료를 전송하여 해당 URI에 저장(변경)

4) DELETE

 : CRUD의 Delete(삭제), 해당 URI의 자원/정보 삭제

5) HEAD

 : 해당 URI에 해당하는 정보의 Header(메타데이터)만 요청

6) OPTIONS

 : 요청한 URI에 대한 정보 요청가능 정보(어떤 메소드가 가능한지? 등)

7) TRACE

 : 이전까지 요청한 정보들의 목록을 요청

8) PATCH

 : 해당 URI 자원의 일부분 교체(부분 변경),

   PUT은 해당 URI정보를 전체 새로변경 / PATCH는 이미존재 자원의 일부분만 변경 

 

* POST / PUT 차이점

  : Idempotent(멱등) 차이

    -> "f(x) = f(f(x))" 의미로 여러번의 같은 작업 반복에도 같은 값이 나온다는 점 

    ex) "POST /dogs" 요청 시

        : 실행할 때마다 응답결과가 달라짐 "Not idempotent"

// POST
//  : 클라이언트가 리소스의 정확한(유일한) 위치를 지정하지 않았을때 사용하는 연산

POST /dogs HTTP/1.1
{
	"name" : "blue",
	"age" : 5
}
HTTP/1.1 201 Created

// /dogs 폴더 내에 name:blue, age:5인 데이터를 생성해라
// 1번 실행시 /dogs/1 생성
// 2번 실행시 /dogs/2 생성
// 3번 실행시 /dogs/3 생성

          ex) "PUT /dogs/2" 요청 시

        : 실행할 때마다 응답결과가 동일 "Is idempotent"

// PUT
//  : 클라이언트가 리소스의 정확한(유일한) 위치를 지정시 사용하는 연산

PUT /dogs/2 HTTP/1.1
{
	"name" : "blue",
	"age" : 5
}
HTTP/1.1 201 Created

// /dogs 폴더 내에 name:blue, age:5인 데이터를 생성해라
// 1번 실행시 /dogs/2 생성
// 2번 실행시 /dogs/2 생성
// 3번 실행시 /dogs/2 생성

          + PATCH (PUT과 유사하지만 다른 메서드)

             : PUT은 리소스의 모든 속성을 업데이트, PATCH는 부분 속성을 업데이트

               PUT과 마찬가지로 "Is idempotent"

 


상태 & 응답 코드 'Response Code'

HTTP 상태 & 응답 코드

: 해당 HTTP 요청에 대한 서버의 응답 코드 종류 설명

 

2xx - 성공

200 - OK

 : 일반적인 요청 성공의 의미

 

201 - Created

 : 리소스 생성 성공에 대한 응답코드, CRUD의 Create (POST 메서드)

 

202 - Accepted

 : 대체로 처리 시간이 오래 걸리는 비동기 요청에 대한 응답에 사용

 

3xx 

301 - Moved Permanently

 : 리소스가 이동되었을 경우 응답코드, 이동된 리소스의 URI를 응답 Location헤더에 명시 필요

 

4xx 

400 - Bad Request

 : 일반적인 요청실패 의미, 서버가 이해할 수 없는 형식의 요청일 경우 

 

401 - Unauthorized

 : 리소스 접근 권한이 없다는 것의 응답코드, Authorization인증 같은 헤더 필요

 

     403 - Forbiddem

 : 감춰진 리소스 접근 시 응답코드, 401과 달리 인증 여부 관계X 리소스 숨김

 

404 - Not Found

 : 해당 URI와 매치되는 리소스가 없다는 의미의 응답코드, 빈번한 응답코드

 

405 - Method Not Allowed

 : 지원하지 않는 요청(POST 처리 컨트롤러 자원에 GET 요청시)에 대한 응답코드,

   응답 메시지에 Allow 헤더 추가하여 지원하는 메서드를 명시하여 클라이언트에게 알려야함

// 해당 URI는 GET, POST 메서드만 지원한다는 의미
Allow: GET, POST

 

406 - Not Acceptable

 : 해당 미디어 타입(MIME 타입) 지원하지 않을 경우 응답코드,

   ex) Accept 헤더의 Application/xml에 지원이 불가능할 경우

 

409 - Conflict

  : 요청에 문제 x, 리소스 상태에 의해 수행 불가능할 경우 응답코드

    ex) 이미 삭제된 리소스를 삭제하는 경우 

 

5xx 

500 - Internal Server Error

 : 일반적인 서버에러,

   4xx는 보통 클라이언트 측 에러, 5xx는 보통 서버 측 에러가 대부분 

 

503 - Service Unavailable

 : 가장 두려운 응답코드 중 하나, 현재 서버 과부하 & 유지보수로 접근 거부

 

RESTful API

REST란 ?

: Representational State Transfer, HTTP 프로토콜 장점을 최대 활용할 수 있는 네트워크 기반 아키텍처

HTTP 메소드를 사용하여 서버와 통신하는 것을 Restful API라고 함

데이터의 CRUD를 위해 사용 - GET / POST / PUT / DELETE