[TIL] Web : HTTP

8945 단어 TILwebhttpTIL

HTTP 통신의 개괄적인 내용이며 Stateless, Request, Response, Status code 등에 등에 대한 내용을 포함하고 있습니다. 😊

HTTP? 📶

HTTP, 단어로 분리해서 들으면 이게 뭔가 싶지만 우리는 웹 서핑을 하다 주소창에서 심심치 않게 이것을 확인할 수 있다. 그렇지만 굳이 이것에 대해 알아보려 하는 생각은 하지 않았을 것이다. 그렇다면 HTTP는 무엇인가.

앞서 개발자 도구의 네트워크 패널에 대해 공부하면서 HTTP Status에 대해 잠시 알아본 바가 있다. 이는 리소스의 요청과 응답에 있어 그 상태를 나타내는 것이라고 간단히 이해했었다. 그러한 맥락에서 HTTP의 정의부터 알아보자.

HTTP는 HyperText Transfer Protocol의 약자로 클라이언트와 서버 사이에서 이루어지는 요청(Request) 및 응답(Response)의 과정을 정리한 규약(Protocol)이다. 사람들도 내가 원하는 정보를 얻기 위해서 소통하고자 할 때 이를 묻는 양식이 정해져있다. "어떠한 정보가 필요한지, 물어보는 방식은 무엇인지" 등과 "그 요청에 대해 답변할 수 있는지, 안된다면 이유는 무엇인지" 등에 대해 커뮤니케이션 한다. 컴퓨터 또한 이러한 커뮤니케이션을 위한 규약이 필요한 것이다.

그렇다면 데이터를 요청하여 받고 이를 활용하여 화면에 나타내기 위해선 HTTP를 알아야겠네요? 🤔

그래서 이제 HTTP어떤 특징을 갖는지, 요청과 응답은 어떠한 형식으로 이루어지는지 등에 대한 내용을 알아볼 것이다.

HTTP의 특징 📤


HTTP는 위에서 언급했던 내용을 포함하여 다양한 특징을 가진다. 우선 대부분의 파일 형식들을 HTTP 통신을 이용해 전송 가능하다. 대표적으로 JSON, TEXT, IMAGE 파일들을 전송하는데 사용할 수 있다.

이러한 데이터의 이동은 위에서 언급한 바와 같이 요청과 그에 따른 응답으로 이루어지고, 응답과 요청은 무상태비연결성이라는 특징을 갖는다.

Request & Response 🔛

HTTP 통신은 클라이언트 측에서 요청을 보내면 이에 따라 서버 측에서 결과에 따라 응답을 보내는 형식을 갖는다. 당연히도 이에 대한 형식이 존재하고 이러한 형식에 맞추지 않고 맘대로 요청을 진행할 경우 문제가 발생할 것이다.
(위 짤처럼 밑도 끝도 없이 달라고 하면 못 알아먹는다...😅)

그렇기 때문에 우리는 각각의 형식에 대해 이해할 필요가 있는 것이다.

Request


요청(Request)은 크게 StartLine , Headers , Body세 가지로 구분된다. 각각의 영역에는 다음과 같은 정보가 들어간다.

  • StartLine : 요청의 첫 번째 줄. 요청의 개괄적인 부분에 해당한다.
    = HTTP method / Request Target / HTTP version
  • Headers : 요청의 메타데이터가 담기며 객체 형태를 갖는다.
    = Headers { Host : ~, User-Agent : ~ ... }
  • Body : 요청의 상세 내용에 해당한다. 역시 객체 형태를 갖는다. Headers 와 유사한 구조를 갖는다. Body 가 존재하지 않는 메서드도 있다.(ex) Get)
    = Body { Host : ~, User-Agent : ~ ... }

Response


응답(Response) 또한 요청과 같이 StartLine , Headers , Body세 가지로 구분되고, 내용 또한 대체로 유사하다.

  • StartLine : 응답의 첫 번째 줄. 응답 상태에 대한 간략한 내용을 포함한다.
    = HTTP version / Status Code / Status Text
  • Headers : 응답의 메타데이터가 담기며 객체 형태를 갖는다.
    = Headers { Connection : ~, Content-Length : ~ ... }
  • Body : 응답의 상세 내용에 해당하며, 역시 객체 형태를 갖는다. 요청과 마찬가지로 생략될 수도 있다.


위와 같은 구조를 갖는 요청과 응답은 다음의 예시와 같이 진행된다.

💡 HTTP Method

HTTP 통신에서 어떠한 목적을 갖고 있는 지에 따라 다른 HTTP Method가 사용된다. 다양한 Method가 있지만, 가장 많이 사용하는 GETPOST 를 비교하면서 알아보자.

우선 GET의 경우 데이터를 읽거나 검색할 때 사용하는 메서드로 성공적으로 이루어졌을 때, HTTP Code 200 OK를 반환한다. 또한 GET 요청은 idempotent(멱등성) 한데 이는 같은 요청을 하더라도 매번 같은 값을 반환한다는 의미를 가진다. 그러므로 GET 을 데이터를 변경하는 등의 안전하지 않은 연산에 사용하는 것을 지양한다.

반면에 POST 의 경우, 새로운 리소스의 생성에 사용된다. 더 구체적으로 부모 요소의 하위 리소스 생성에 사용된다는 말이다. 그렇기에 POST 는 성공적으로 완수하면 201 Created 를 반환한다. 그리고 POST 메서드는 GET 과 반대로 idempotent 하지 않기에 같은 POST 요청을 반복해도 같은 결과를 확신할 수 없다. 그러므로 같은 POST 요청을 보내면 다른 리소스를 반환할 가능성이 높다.

보다 더 구체적인 내용은 Request methods에 대한 명세w3schools.com의 GET method vs POST method를 참조하자.


Connectionless


요청과 응답에 있어 클라이언트와 서버는 연결을 시작한 이후 과정이 끝나면 동시에 연결을 끊어버린다는 특징을 갖는다. 그렇다면 왜 연결을 굳이 끊어야만 하는 것일까?

서버는 불특정 다수의 클라이언트와 통신을 해야하는 환경을 갖는데 만약 이 연결을 계속 유지한다면, 이와 함께 발생하는 리소스가 불가피하게 늘어날 것이고 연결의 수 또한 감소할 것이다. 그러한 이유 때문에 HTTP 통신은 비연결성을 갖는다.

이렇게 들으면 비연결성이 단점이 없는 것 같지만, 반복적으로 연결 및 해제의 과정을 거쳐야 하기에, 오버헤드가 발생할 수 있다는 단점 또한 갖고 있다.

Stateless

위에서 언급한 비연결성으로 인해 각각의 요청은 구분되어 서버에게 독립적인 대상으로 취급 받는다. 이 말이 무슨 말이냐면, 바로 이전에 보낸 요청임에도 불구하고 이전의 요청과 연관성을 갖지 못하며, 서로 간 영향을 주지 않는다는 것이다.

예를 들어, 다음과 같은 상황이 존재한다.

// Request/Response 1
Client -- '나는 유저 "a" 야 로그인 할 수 있니?' --> Server
Server -- '알겠어, 확인하고 시켜줄게' --> Client

// Request/Response 2
Client -- '전에 왔던, 유저 "a" 야 로그인 시켜줘' --> Server
Server -- '너가 누군데, 난 "a" 몰라' --> Client


앞의 요청에서 유저 a 라는 데이터를 확인하여 로그인을 요청하였고, 이에 따라 로그인이 되었지만 다시 로그인을 진행할 때, 전에 있던 유저 a 가 방문했던 기록을 다시 참조하는 것이 불가능하다고 했다.

이처럼 요청 간에는 독립성이 존재하기 때문에, 매 연결마다 새로운 데이터를 가져와야 하는 단점이 존재할 것이다.

이러한 상황에서 중복 요청을 방지하고자, 토큰을 포함하여 응답과 함께 보내 클라이언트에 저장하고 다음에 같은 요청을 진행하고자 할 때, 토큰을 함께 포함하여 요청을 시도하면 이를 더 신속하게 처리할 수 있도록 한다. 이러한 토큰은 클라이언트에 쿠키나 스토리지 등의 형태로 저장된다.


HTTP Status Code ❗

위에서 요청과 응답을 알아보았는데, 적절한 요청을 보냈을 때 응답에 포함되어 오는 정보 중, HTTP 통신의 상태를 나타내는 코드가 있다.

이러한 상태 코드의 유형은 아주 다양하지만, 그 중 간략하게 구분지어 몇 가지만 알아보도록 하자.

요청 성공


아래의 상태 코드들은 요청에 의해 연결이 성공적으로 진행되거나, 요청한 데이터가 성공적으로 전송된 경우 등을 의미한다.

  • 200 OK : 성공적으로 응답
  • 201 Created : 성공적으로 리소스 생성

클라이언트 에러


오류가 발생한 부분이 요청 부분에서 잘못된 것으로, 주로 프론트엔드 단에서 오류가 발생했을 때 보이는 응답 코드다.

  • 400 Bad Request : 유효하지 않는 요청
  • 401 Unauthorized : 리소스 요청에 대한 인증자격 부족
  • 403 Forbidden : 요청을 이해했지만 승인을 거부
  • 404 Not Found : 서버가 요청한 리소스를 찾을 수 없음

서버 에러


오류가 서버 측에서 발생했을 경우 나타나는 응답 코드로, 주로 백엔드 단에서 문제가 발생하면 나타나는 응답 코드다.

  • 500 Internal Server Error : 내부 서버 오류로 요청을 이행하지 못함
  • 501 Not Implemented : 요청 수행에 필요한 기능을 서버가 지원하지 않음

마무리 🧾


오늘도 어김없이 마무리 정리 시간이 돌아왔다. HTTP에 대한 전반적인 내용을 정리하면서 마무리하자.

  • HTTP란 클라이언트와 서버 사이의 요청응답을 규정한 규약이다.
  • HTTP는 요청(Request)응답(Response)으로 이루어지며 요청과 응답은 StartLine , Headers , Body 구분되는 형식을 갖는다.
  • HTTP는 비연결성(Connectionless)과 무상태(Stateless)의 특징을 갖기 때문에 각종 스토리지와 쿠키를 활용한다.
  • HTTP 통신 상태를 표현하는 응답 코드(HTTP Status Code)가 존재하며 각 코드마다 성공하거나 실패의 내용을 포함한다.

🔖 출처

HTTP : wikipedia : HTTP
HTTP 특징 : kotlinworld : HTTP(HyperText Transfer Protocol)의 특징
HTTP Status Code : MDN Web Docs : HTTP 상태 코드

좋은 웹페이지 즐겨찾기