HTTP
: HyperText Transfer Protocol
클라이언트가 먼저 HTTP에 요청을 서버에 보내면 서버는 요청을 처리한 후 결과에 따른 HTTP 응답을 클라이언트에게 보냄으로써 하나의 HTTP 통신이 된다.
백엔드 API 시스템의 엔드포인트 구현도 기본적으로 HTTP 요청을 인풋으로 받아서 HTTP 응답을 아웃풋으로 리턴하는 구조로 구현을 하게 된다.
@app.route("/ping", methods=['GET'])
def ping():
return "pong"
"ping" 엔드포인트의 경우에도 마찬가지로 HTTP 요청과 응답이 오고 가는 구조이다.
HTTP 요청은 "/ping" 주소에 GET 요청을 보내는 것이고, HTTP 응답은 200 OK 상태 코드와 함께 "pong"이라는 텍스트를 보내는 것이다.
위에서는 Flask가 자동으로 HTTP 응답으로 변환시켜 준다.
상태가 없다는 뜻으로, HTTP 통신에서는 상태라는 개념이 존재하지 않는다.
각각의 HTTP 통신은 독립적이며 그 전에 처리된 HTTP 통신에 대해서 전혀 알지 못한다.
이 특성의 장점은 HTTP 통신 간의 진행이나 연결 상태의 처리나 저장을 구현하지 않아도 되는 것이고,
단점은 HTTP 요청을 보낼 때마다 해당 요청을 처리하기 위해 필요한 모든 데이터를 매번 포함시켜서 요청을 보내야 한다.
위의 단점을 해결하기 위해 쿠키(cookei)나 세션(session) 등을 사용하여 HTTP 요청을 처리할 때 필요한 진행 과정이나 데이터를 저장한다.
: 웹 브라우저가 웹사이트에서 보내온 정보를 저장할 수 있도록 하는 조그마한 파일
: 쿠키와 마찬가지로 HTTP 통신상에서 필요한 데이터를 저장할 수 있게 하는 메커니즘.
쿠키와의 차이점은 쿠키는 웹 브라우저, 즉 클라이언트 측에서 데이터를 저장하는 반면에 세션은 웹 서버에서 데이터를 저장한다.
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 요청과 응답 메시지의 모든 부분을 직접 구현할 필요는 없다. Flask(or Django 등의 다른 웹 프레임워크)가 거의 대부분을 알아서 처리해 준다. 일반적으로 개발자가 직접 지정해야 하는 부분은 HTTP 메소드와 status code, 몇 개의 헤더 정보, 그리고 body 부분이다. 하지만 기본 구조와 내용은 이해하고 있어야 한다.
: HTTP 요청의 시작줄.
GET / search HTTP/1.1
start line은 세 부분으로 구성되어 있다.
: 해당 HTTP 요청이 의도하는 액션(action)을 정의하는 부분이다.
: 해당 HTTP 요청이 전송되는 목표 주소를 말한다.
: 해당 요청의 HTTP 버전을 나타낸다.
현재 "1.0", "1.1", 그리고 "2.0" 버전이 있다.
HTTP 버전에 따라 HTTP 요청 메시지의 구조나 데이터가 약간씩 다를 수 있으므로 서버가 받은 요청의 HTTP version에 맞추어서 응답을 보낼 수 있도록 하기 위함이다.
: start line 다음에 나오며 HTTP 요청 그 자체에 대한 정보를 담고 있다.
HOST : google.com
Host
: 요청이 전송되는 target의 호스트의 URL 주소를 알려 주는 헤더다.
User-Agent
: 요청을 보내는 클라이언트에 대한 정보 (ex. 웹 브라우저에 대한 정보)
Accept
: 해당 요청이 받을 수 있는 응답(response) body 데이터 타입을 알려 주는 헤더.
*/*
로 지정해주면 된다.Connection
: 해당 요청이 끝난 후에 클라이언트와 서버가 계속해서 네트워크 연결을 유지할 것인지 아닌지에 대해 알려주는 헤더
Content-Type
: HTTP 요청이 보내는 메시지 body의 타입을 알려주는 헤더이다.
Content-Length
: HTTP 요청이 보내는 메시지 body의 총 사이즈를 알려주는 헤더이다.
: HTTP 요청 메시지에서 body 부분은 HTTP 요청이 전송하는 데이터를 담고 있는 부분이다. 전송하는 데이터가 없다면 body 부분은 비어 있게 된다.
깔끔한 파이썬 탄탄한 백엔드 / 저자: 송은우