TIL

[2022.07.10] HTTP 프로토콜

윤레옹 2022. 7. 10. 17:57

HTTP 프로토콜이란?

HTTP는 Hypertext Transfer Protocol의 약자로 데이터를 주고받기 위해 정의한 통신 프로토콜이다.

 

웹을 기준으로 브라우저와 서버 간에 데이터를 주고받기 위한 방식으로 HTTP 프로토콜을 사용하고 있다.

HTTP 프로토콜 특징

HTTP 프로토콜은 상태가 없는(stateless) 프로토콜이다.

 

여기서 상태가 없다는 말은 데이터를 주고받기를 위한 각각의 데이터 요청이 서로 독립적으로 관리가 된다는 것이다.

 

좀 더 쉽게 말해 이전 데이터 요청과 다음 데이터 요청이 서로 관련이 없다는 것이다.

 

이러한 특징 덕분에 서버는 세션과 같은 별도의 추가 정보를 관리하지 않아도 되고, 다수의 요청 처리 및 서버의 부하를
줄일 수 있는 성능 상의 이점이 생긴다.

 

HTTP 프로토콜은 일반적으로 TCP/IP 통신 위에서 동작하며 기본 포트는 80번이다.

 

HTTP Request & HTTP Response

HTTP 프로토콜로 데이터를 주고받기 위해서는 위 그림과 같이 요청(Request)을 보내고 응답(Response)을 받아야 한다.

 

URL

URL 구조

URL(Uniform Resource Locators)은 서버에 자원(resource)을 요청하기 위해 입력하는 영문 주소이다.

 

숫자로 되어있는 IP주소보다 훨씬 기억하기 쉽다는 장점이 있다.

 

브라우저에서는 url로 되어있는 HTTP 요청을 DNS(Domain Name System)를 통해 host에 해당하는 실제 IP 주소로 변환하여
서버에 요청(Request)을 보낸다.

 

HTTP 요청 메서드

앞에서 살펴본 URL을 이용하면 서버에 특정 데이터를 요청할 수 있다.
요청을 할 때 HTTP 요청 메서드(Http Request Methods)를 이용하면 된다.

 

일반적으로 HTTP 요청 메서드는 HTTP Verbs라고도 불리며 아래와 같은 주요 메서드를 가지고 있다.

  • GET : 존재하는 자원에 대한 요청
  • POST : 새로운 자원을 생성
  • PUT : 존재하는 자원에 대한 변경
  • DELETE : 존재하는 자원에 대한 삭제

이와 같이 데이터에 대한 조회, 생성, 변경, 삭제 동작을 HTTP 요청 메서드로 정의할 수 있다.

참고로 때에 따라 POST 메서드로 PUT, DELETE의 동작도 수행할 수 있다.

 

기타 요청 메서드는 다음과 같다.

  • HEAD : 서버 헤더 정보를 획득. GET과 비슷하나 Response Body를 반환하지 않음
  • OPTIONS : 서버 옵션들을 확인하기 위한 요청. CORS에서 사용

 

HTTP 상태 코드

HTTP 상태 코드(HTTP Status Code)는 서버에서 설정해주는 응답(Response) 정보이다.

 

주요 상태 코드는 200번대부터 500번대 까지 다양하게 있지만 주요한 상태 코드만 몇 개 알아보자.

 

2xx - 성공

200번대의 상태 코드는 대부분 성공을 의미한다.

  • 200 : GET 요청에 대한 성공
  • 204 : No Content. 성공했으나 응답 본문에 데이터가 없음
  • 205 : Reset Content. 성공했으나 클라이언트의 화면을 새로 고침 하도록 권고
  • 206 : Partial Conent. 성공했으나 일부 범위의 데이터만 반환

3xx - 리다이렉션

300번대의 상태 코드는 대부분 클라이언트가 이전 주소로 데이터를 요청하여 서버에서 새 URL로 리다이렉트를 유도하는 경우이다.

  • 301 : Moved Permanently, 요청한 자원이 새 URL에 존재
  • 303 : See Other, 요청한 자원이 임시 주소에 존재
  • 304 : Not Modified, 요청한 자원이 변경되지 않았으므로 클라이언트에서 캐싱된 자원을 사용하도록 권고

4xx - 클라이언트 에러

400번대 상태 코드는 대부분 클라이언트의 코드가 잘못된 경우이다.
유효하지 않은 자원을 요청했거나 요청이나 권한이 잘못된 경우 발생한다.
가장 익숙한 상태 코드는 404 코드인데, 요청한 자원이 서버에 없다는 의미이다.

  • 400 : Bad Request, 잘못된 요청
  • 401 : Unauthorized, 권한 없이 요청. Authorization 헤더가 잘못된 경우
  • 403 : Forbidden, 서버에서 해당 자원에 대해 접근 금지
  • 405 : Method Not Allowed, 허용되지 않은 요청 메서드
  • 409 : Conflict, 최신 자원이 아닌데 업데이트하는 경우. ex) 파일 업로드 시 버전 충돌

5xx - 서버 에러

500번대 상태 코드는 서버 쪽에서 오류가 난 경우이다.

  • 501 : Not Implemented, 요청한 동작에 대해 서버가 수행할 수 없는 경우
  • 503 : Service Unavailable, 서버가 과부하 또는 유지 보수로 내려간 경우

 

다시 요청과 응답을 보면

앞에서 말한 URL, 요청 메서드, 상태 코드를 아래와 같은 구조로 나오게 된다.

 

 

HTTP/ 1.1과  HTTP/2.0의 차이

HTTP/1.1은 기본적으로 커넥션 당 하나의 요청과 응답만 처리한다.

 

즉, 여러 개의 요청을 한 번에 전송할 수 없고 응답 또한 마찬가지다.

 

따라서 HTML 문서 내에 포함된 여러 개의 리소스 요청,
즉 CSS 파일을 로드하는 link 태그, 이미지 파일을 로드하는 img 태그, 자바스크립트를 로드하는 script 태그 등에 의한
리소스 요청이 개별적으로 전송되고 응답 또한 개별적으로 전송된다.

 

이처럼 HTTP/1.1은 리소스의 동시 전송이 불가능한 구조이므로 요청할 리소스의 개수에 비례하여 응답 시간도 증가하는 단점이 있다.

HTTP/2는 커넥션 당 여러 개의 요청과 응답, 즉 다중 요청/응답이 가능하다.

 

여러 리소스의 동시 전송이 가능하므로 HTTP/1.1에 비해 페이지 로드 속도가 약 50% 정도 빠르다고 알려져 있다.

 

HTTP와 HTTPS의 차이

HTTPS는 HTTP에 데이터 암호화가 추가된 프로토콜이다.

 

HTTPS는 HTTP(80번)와 다르게 443번 포트를 사용하며,
네트워크 상에서 중간에 제3자가 정보를 볼 수 없도록 공개키 암호화를 지원하고 있다.

 

HTTPS를 사용할 경우 내가 브라우저를 통해 입력하는 정보를 (ex: form data) 다른 누군가가 훔쳐보지 못하게 만드는 기능이다.

 

HTTP 형식으로 입력한 정보를 보낼 경우, 입력한 형태 그대로 보내지게 된다.

id: my_naver_id
pw: my_naver_pw

따라서 누군가가 악의적으로 이 요청을 캐치해서 내 정보를 들여다본다면, 그대로 아이디와 비밀번호가 노출될 수 있다.

 

하지만 HTTPS를 사용할 경우, 이 통신 요청(request)을 보낼 때 응답(response)을 해주는 서버만 알아볼 수 있도록 정보를 암호화해서 보내게 된다

실제로 이렇다는 것은 아니고 이해를 돕기위해 작성하였습니다 😁

id: ^!@$!A_!@E!@#(_a*&@)
pw: !@#%_+#$%_!#@!$

또한 HTTPS는 기관으로부터 검증된 사이트만 주소에 HTTPS 사용이 허가되기 때문에, 내가 접속한 사이트가 상대적으로 안전한 주소를 가졌음을 증명하는 것이기도 하다

 

 공개키 (비대칭키) 방식

HTTPS는 공개키/개인키 암호화 방식을 이용해 데이터를 암호화하고 있다. 공개키와 개인키는 서로를 위한 1쌍의 키이다.

  • 공개키: 모두에게 공개된, 또는 공개가 가능한 키
  • 개인키: 나만 가지고 알고 있어야 하는 키

공개키와 개인키로 암호화하면 다음과 같은 효과를 얻을 수 있다.

  • 공개키 암호화: 공개키로 암호화를 하면 개인키로만 복호화할 수 있다. -> 개인키는 나만 가지고 있으므로, 나만 볼 수 있다.
  • 개인키 암호화: 개인키로 암호화하면 공개키로만 복호화할 수 있다. -> 공개키는 모두에게 공개되어 있으므로, 내가 인증한 정보임을 알려 신뢰성을 보장할 수 있다.

HTTPS를 사용하기 위해서는 인증된 기관 CA(Certificate Authority)에 공개키를 전송하여 인증서를 발급받아야 한다.

 

 

 

HTTP에 대해서 공부를 했는데, 파도 파도 계속 나온다...

쓰기만 했지 개념에 대해서는 몰랐는데 알아갈수록 신기하다.

아직 이해가 잘 되지는 않지만, 알아가는 게 있어서 다행이다.

 

 

 

 

 

참조 자료:

https://joshua1988.github.io/web-development/http-part1/

 

프런트엔드 개발자가 알아야하는 HTTP 프로토콜 Part 1

API 데이터 요청을 위해 꼭 알아야 하는 HTTP 프로토콜의 정의, HTTP Status Code, HTTP Methods 등

joshua1988.github.io

 

 

https://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98