HTTP란?
- HyperText Transfer Protocol
하이퍼 텍스트 문서를 교환하기 위해 만들어진 통신 규약.
- 프론트앤드와 서버와 클라이언트간의 통신에 사용 또한 백엔드와 프론트앤드 서버간의 통신에도 사용.
- TCP/IP의 특성을 가지고 통신을 한다.
HTTP 핵심요소
- HTTP 기본적으로 요청과 응답 구조로 되어있다. 클라이언트가 request를 서버에 보내면 서버는 response를 보내는 구조. 둘 중 하나가 실패하면 실패. 무조건 둘 다 이루어져야한다.
- HTTP는 상태를 저장하지 않는다. 즉 요청이 오면 응답을 할 뿐 요청/응답끼리 연결되어 있지 않다는 뜻이다. 각각의 요청/ 각각의 응답.
대표적으로 로그인 기능.(이런 특성 때문에 로그인 저장 시에 로컬스토리지나 세션 스토리지, 쿠키 등을 장치로 사용하는 것이다.)
ex)클라이언트가 요청을 보내고 응답을 받은 후 조금있다 다시 요청을 보낼 때 전에 보낸 요청이나 응답에 대해 알지 못한다는 뜻
HTTP Request 구조
Start line : HTTP request의 첫 라인
- HTTP Method : 해당 request가 의도한 action을 정의하는 부분
- Request target : 해당 request가 전송되는 목표 uri. 내가 요청하고 싶은 엔드포인트 주소
- HTTP Version : 사용되는 HTTP버전
GET /search HTTP/1.1
headers : 해당 request에 대한 추가정보를 담고있는 부분
- Key:Value 값으로 되어있음
- Headers도 크게 3부분으로 나뉨
- 자주 사용되는 정보
Host : 요청이 전송되는 target의 host url
User-Agent : 요청을 보내는 클라이언트의 대한 정보(웹 브라우저에 대한 정보)
Accept : 해당 요청이 받을 수 있는 응답 타입
Connection : 해당 요청이 끝난 후에 클라이언트와 서버가 계속해서 네트워크 커넥션을 유지할 것인지 아니면 끊을 것인지에 대해서 지시하는 부분
Content-Type : 해당 요청이 보내는 메세지 body의 타입 예를들어 JSON(JavaScript Object Notation)을 보내면 application/json
Content-Length : 메세지 body의 길이
Accept: *
body : 해당 request의 실제 메세지/내용 (body가 없는 request도 많음 예) GET request)
POST /payment-sync HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3
{
"imp_uid": "imp_1234567890",
"merchant_uid": "order_id_8237352",
"status": "paid"
}
HTTP Response구조
Response도 request와 마찬가지로 크게 3부분으로 구성
Status Line : Response의 상태를 간략하게 나타내주는 부분
- HTTP 버젼
- Status code : 응답 상태를 나타내는 숫자 코드
200
- Status text : 응답 상태를 간략하게 설명해주는 부분
Not Found
HTTP/1.1 404 Not Found
Header : Response의 header와 동일하지만 response에서만 사용되는 header값으로 User-Agent
대신 Server
헤더가 사용(서버의 정보ex)우분투...리눅스...)
Body : Response body와 동일 JSON data
HTTP Methods
GET(자주사용)
- 어떤 데이터를 서버로부터 받아올 때 사용
- 데이터 생성/수정/삭제 없이 받아오기만 할 때 사용
- 가장 간단하고 많이 사용되는 HTTP Method
- 주로 데이터를 받아올 때 사용되기 때문에 request body를 안보내는 경우가 많음
POST(자주사용)
- 데이터를 생성/수정/삭제할 때 주로 사용
- 데이터를 생성 및 수정할 때 사용되기 때문에 request body가 포함되서 보내짐
OPTION
- 주로 요청 URI에서 사용할 수 있는 메소드를 받아올 때 사용
- /update uri에서 어떤 메소드를 요청 가능한지 알고싶으면 먼저 옵션 요청을 사용해서 확인하게 됨.
PUT
- post와 비슷
- post에 밀려서 최근 몇년간 잘 사용되지 않음
DELETE
- 특정 데이터를 서버에 삭제 요청 보낼 때 쓰임
- post에 밀려서 잘 안사용됨..
자주 쓰이는 HTTP Status Code
- 200 OK : 문제없이 잘 실행되었을 때
- 301 Moved Permanetly : 해당 URI가 다른 주소로 바뀌었을 때
- 400 Bad Request : 해당 요청이 잘못되었을 때(주로 input값이 잘못되었을 때)
- 401 Unauthorized : 유저가 해당 요청을 진행하려면 먼저 로그인을 하거나 회원가입이 필요하다는 것을 나타낼 때
- 403 Forbidden : 유저가 해당 요청에 대한 권한이 없을 때
- 404 Not Found : 요청된 uri가 존재하지 않을 때
- 500 Internal Server Error : 서버 에러났을 때
RESTful HTTP API
-
URI(Uniform Resource Identifier)
해당 사이트의 특정 자원의 위치를 나타내는 유일한 구조. 경로 체계
URI 와 URL은 다르다! URI 안에 URL이 있다고 볼 수 있음
-
HTTP Method
POST
, GET
등등.. HTTP request가 의도하는 액션을 정의한 것
-
Payload
HTTP request에서 보내는 데이터(body)
RESTful API
REpresentational State Transfer
- 웹상에서 사용되는 여러 리소스를 HTTP URI로 표현하고 그 리소스에 대한 행위를 HTTP Method로 정의하는 방식.
- 주로
GET
과 POST
만 사용한다.
-예 ) 삼성전자 주식정보를 받기위한 HTTP 요청 : HTTP GET https://api.trueshort.com/stock/005930
유저의 보유 주식 종목들을 DB에 저장하는 HTTP 요청 :
HTTP POST https://api.trueshort.com/user/portfolio
{
"user_id" : 1,
"stocks": [
"005930",
"298730",
"378900"
]
}
RESTful API의 장점과 유의할 점
- 여러 장점들 중 가장 명확한 점은
self-descriptiveness
- 자체만으로도 API의 목적이 쉽게 이해가 감. 예를들어 위에서 보여준 삼성전자 주식에 관한 정보를 HTTP요청정보를 보면 문서나 주석이 없어도 정보를 해석할 수 있다.
유의할 점!!
- 경로가 끝난 뒤에 / 치면 그 뒤에 경로를 의미하므로 경로가 끝나면 / 를 입력하면 안된다.
- URI에
_(underscore)
는 주로 포함하지않고 영어 대문자보다는 소문자를 쓴다. 너무 긴 단어도 잘 사용하지않는데, 이 모든 것은 가독성을 높이기 위한 것!
- URI는 명사를 사용한다.