HTTP / REST API '기본개념'
HTTP패킷 / Header / Body 등 기본개념 익히기
HTTP
HTTP란?
: HyperText Transper Protocol, 링크기반(URL)으로 데이터를 요청하고 받겠다는 통신 규약(Protocol)
HTML / 이미지 / 오디오 / 텍스트 문서같은 리소스들을 서버로부터 통신을 가능하게 만드는 프로토콜
클라이언트 '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 Line (요청 라인) : 요청 방식(Method) / URI / HTTP 버전 등
Header : 사용자 정보 (클라이언트 정보, 요청Body 데이터타입, 응답Body 타입, 문자코드 등)
공백 (White Space) : 헤더(Header)와 Body의 구분을 위한 공백
Body : HTTP Request 요청 메시지(Data)를 담고 있는 부분
: GET 메소드일 경우, 요청URL에 모두 표현하기에 Body는 빈공간
HTTP 응답(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