HTTP 알아보기

박기범·2021년 12월 20일
0

웹 개발자라면 무조건 알아야한다는 네트워크 상식중의 상식인 HTTP를 이제서야 정리하는 나는 대체 뭘까?

아, 오셨는가? 기다리고 있었다. 뭘 궁시렁거리고 있었냐고?

아무일도 없었다.

오늘은 HTTP를 알아보도록 하자. 웹 개발자를 지망한다면, 정말 몰라서는 안되는 필수적인 상식이다. (그렇다고 내가 잘 알고 있다는건 아니다. 그랬으면 이 글을 쓰지 않겠지..)

HTTP?


HTTP는 서버/클라이언트의 통신을 위한 어플리케이션 계층(7계층)의 프로토콜이다. TCP/IP 프로토콜 위에서 동작하며, 클라이언트 측에서 http request를 통해 서버에 데이터, 혹은 작업을 요청하고, 그에 대한 응답 결과로 서버로부터 http response를 받는다.

클라이언트가 http request를 날리기 위한 method의 형태는 get, post, put, delete 등으로 지정되어 있으며, 이에 대한 응답을 위해 http status code도 정의되어 있다. 이는 추후 서술한다.

stateless

앞서 서술한 HTTP 프로토콜은 stateless 형태의 프로토콜이다. 쉽게 말해서, 이전 작업의 상태를 저장하지 않는다. 즉, 서로 다른 HTTP 요청은 연관되어있지 않다. HTTP 프로토콜에서는 클라이언트가 request를 날리고, 서버로부터 response를 정상적으로 받게되면 (이때 정상적이라 함은 무조건 200을 말하는 것이 아닌, response 자체를 받았다는것을 의미한다.) 연결을 끊어버리게 된다. 하나의 자원에 대해서 하나의 연결을 만든다고도 표현할 수 있다.

한가지 이상한점이 있다. 이전 HTTP 통신이 이 후 HTTP 통신에 영향을 미치지 않는다면, 도대체 어떻게 로그인과 같은 상태를 유지할 수 있는가?

이에 대한 해답이 바로 쿠키다.
HTTP 통신을 통해 쿠키를 생성하고, 이를 클라이언트, 혹은 서버 측에 저장하여 그 상태를 유지할 수 있다. 즉, HTTP 자체에는 상태가 없지만, HTTP 쿠키가 상태가 있는 세션을 만들어준다.

HTTP message

그렇다면, HTTP request와 response는 구체적으로 어떤 메시지를 담고있을까? 한번 살펴보자.

1. HTTP request

일반적으로 request는 위와 같은 정보를 포함하고 있다.

  • method : client가 server에 데이터, 혹은 작업을 요청하는 방법을 정의한다. 사전 정의되어있는 http method의 종류에 따르며, 위의 예시에서는 get method가 사용되었다.
  • path : 리소스가 위치한 실제 경로를 가리킨다.
  • version of the protocol : 사용할 HTTP 프로토콜 버전을 명시한다.
  • headers : 이외의 서버에 대해 서술할 정보들을 담는다.
    - 이 헤더 값을 이용하여 캐시를 제어할 수 있으며, 요청자의 자격증명을 표시하거나, 리소스 접근에 사용되어야 하는 인증 메소드를 지정할 수 있다.
  • request body : 위의 예시 이외에도 request에 body가 담길 수 있는데, 이는 post를 포함한 몇몇 http method에서 사용하는 부가적인 정보이다.

2. HTTP response

response에는 다음과 같은 내용이 담긴다.

  • HTTP 프로토콜의 버전.
  • 요청의 성공 여부와, 그 이유를 나타내는 상태 코드.
  • 아무런 영향력이 없는, 상태 코드의 짧은 설명을 나타내는 상태 메시지.
  • 요청 헤더와 비슷한, HTTP 헤더들.
  • 선택 사항으로, 가져온 리소스가 포함되는 본문.

HTTP method

HTTP request에 사용될 수 있는 대표적인 method들은 다음과 같다.

  • GET : GET 메서드는 특정 리소스의 표시를 요청한다. GET을 사용하는 요청은 오직 데이터를 받기만 한다. (때에따라 body를 사용할 수 있으나, 권장하지 않는다.)

  • HEAD : HEAD 메서드는 GET 메서드의 요청과 동일한 응답을 요구하지만, 응답 본문(body)을 포함하지 않는다.

  • POST : POST 메서드는 서버에 데이터를 전송할 때 사용한다. POST는 멱등성이 보장되지 않아, 동일한 요청에 대해서도 다른 결과가 나타날 수 있다. 즉, POST를 통해 하나의 엔티티를 중복하여 서버에 제출하면, 그 데이터가 서버에 새로운 엔티티로써 기록되게 된다. POST에 대한 응답은 캐싱이 가능하다.

  • PUT : PUT 메서드는 목적 리소스의 현재 상태를 요청 payload로 바꾼다. 그리고, 목적 리소스가 서버에 존재하지 않으면 create 한다. 즉, 중복으로 요청해도 같은 값이 돌아와 멱등성을 보장한다. PUT에 대한 응답은 캐싱이 불가능하다.

  • DELETE : DELETE 메서드는 특정 리소스를 삭제한다.

위의 내용을 보면 멱등성이라는 단어가 존재한다. PUT과 POST를 구별하는 중요한 요소이므로 짚고 넘어가자.

아래는 MDN에 게시된 멱등성의 정의이다.

동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 말합니다.
다른 말로는, 멱등성 메서드에는 통계 기록 등을 제외하면 어떠한 부수 효과(side effect)도 존재해서는 안됩니다.
올바르게 구현한 경우 GET, HEAD, PUT, DELETE 메서드는 멱등성을 가지며, POST 메서드는 그렇지 않습니다.

Http status code

request에 사용되는 method를 알아보았으니, 이제는 response의 status code 몇가지를 알아보자.

  • 2xx (성공)
    200 (성공): 서버가 요청을 제대로 처리함
    201 (생성됨): 요청이 성공했으며, 새로운 리소스가 생성됨
    202 (허용됨): 요청을 받았으나 아직 처리하진 않음
    204 (컨텐츠 없음): 요청을 처리했지만, 컨텐츠를 제공하지 않음
    205 (컨텐츠 재설정): 요청을 처리했지만, 컨텐츠를 표시하지 않음. 그리고 문서를 재 설정할 것을 요구함
    206 (일부 성공): 요청의 일부만 성공적으로 처리함

  • 4xx (요청 오류 / 클라이언트 측의 오류)
    400 (잘못된 요청): 서버가 요청의 구문을 인식하지 못함. 주로 헤더 포멧이 HTTP 규약에 맞지 않을 경우
    401 (권한 없음): 인증을 필요로 하는 요청, 인증 실패
    403 (Forbidden, 금지됨): 서버가 요청을 거부, 인가 실패
    404 (Not Found, 찾을 수 없음): 서버가 요청한 리소스를 찾을 수 없음
    405 (허용하지 않는 방법): 요청에 지정된 방법을 사용할 수 없음. 예를 들어 POST 방식으로 요청을 받는 서버에 GET 요청을 보내는 경우

  • 5xx (서버 오류)
    500 (내부 서버 오류): 서버에 오류가 발생하여 요청을 수행할 수 없음

HTTP vs HTTPS

http 프로토콜은 암호화가 이루어지지 않는 7계층의 통신 프로토콜이다. 따라서 패킷캡쳐 등의 방법을 통해 http 프로토콜이 전송한 데이터를 모두 감청할 수 있다. 만약 패스워드 같은 민감 정보가 http 프로토콜로 통신될 시, 이러한 데이터가 허가받지 않은 제 3자도 확인할 수 있도록 평문의 형태로 전송된다. 또한 http 프로토콜로 통신하면 각 정보의 송신자와 수신자가 정말 그 정보의 송신자와 수신자 자신인지 확인할 수 없어 masquerade가 가능해진다. 이와 동시에 데이터의 무결성도 보장되지 않아 데이터 변조의 가능성도 존재한다.

https 프로토콜은 http 통신의 단점을 보완하기 위한 프로토콜이다. https 통신에서 http 프로토콜은 7계층의 ssl 프로토콜과 통신하고, ssl이 하위 네트워크 계층과 통신하는 형태로 데이터를 주고받는다. 이 과정에서 데이터가 암호화되고 인증서를 이용하여 송신자와 수신자의 인증이 가능해진다.

참고자료

https://shlee0882.tistory.com/107
https://developer.mozilla.org/ko/docs/Web/HTTP/Overview
https://velog.io/@dnjscksdn98/HTTP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC
https://velog.io/@53_eddy_jo/RESTful%ED%95%9C-%EC%84%B8%EA%B3%84%EC%97%90%EC%84%9C%EC%9D%98-POST%EC%99%80-PUT%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EA%B1%B0%EA%B8%B0%EC%97%90-FETCH%EA%B9%8C%EC%A7%80
https://developer.mozilla.org/ko/docs/Glossary/Idempotent

profile
원리를 좋아하는 개발자

0개의 댓글