Web

HTTP에 대해 알아보자

Yepchani 2024. 1. 30. 22:07
반응형

들어가며

이번 시간에는 웹 기반 커뮤니케이션의 표준으로 널리 채택되어 사용되고 있는 HTTP에 대해 알아보도록 하겠습니다.

 

HTTP란?

HTTP(HyperText Transfer Protocol)웹 상에서 클라이언트와 서버 간에 정보를 주고받는 방식을 정의한 프로토콜(규약)입니다. 웹 브라우저(클라이언트)가 웹 서버에 정보를 요청하고, 웹 서버가 해당 요청에 대한 응답을 반환하는 과정에서 사용됩니다.

 

HTTP의 작동 방식

 HTTP는 클라이언트가 서버에 요청(request)을 보내며 시작합니다. 이 요청은 HTTP 메서드를 포함하며, 이 메서드는 클라이언트가 수행하고자 하는 작업을 서버에 알려줍니다. 서버는 이 요청을 받아 처리한 후, 클라이언트에게 응답(response)을 반환합니다. 이 응답에는 HTTP 상태 코드가 포함되어 요청이 성공적으로 처리되었는지, 아니면 어떤 문제가 발생했는지를 나타냅니다.

 

다음은 요청과 응답의 예시입니다.

 

요청

GET / HTTP/1.1
Host: www.example.com
  • HTTP 메서드: GET
  • 설명: 웹 브라우저가 http://www.example.com의 홈페이지를 보여달라고 요청합니다.

 

응답

HTTP/1.1 200 OK
Content-Type: text/html

<!DOCTYPE html>
<html>
<head>
    <title>Example Website</title>
</head>
<body>
    Welcome to my website!
</body>
</html>
  • 상태 코드: 200 OK
  • 설명: 클라이언트의 요청을 성공적으로 처리했음을 나타냅니다. 요청한 웹 페이지의 HTML 코드를 반환합니다.

 

HTTP 메서드

HTTP 메서드는 클라이언트가 수행하려는 작업을 서버에 알리는 데 사용됩니다.

 

주요 메서드는 다음과 같습니다.

  • GET
    서버에서 특정 리소스를 가져옵니다. GET 요청은 데이터를 변경하지 않으며, 주로 서버에 저장된 정보를 조회하는 데 사용됩니다.
  • POST
    서버에 새로운 리소스를 생성합니다. POST 요청은 일반적으로 서버에 보내는 데이터를 포함하며, 이 데이터는 새 리소스를 생성하는 데 사용됩니다.
  • PUT
    서버의 특정 리소스를 업데이트합니다. PUT 요청은 서버에 보내는 데이터를 포함하며, 이 데이터는 기존 리소스를 수정하는 데 사용됩니다.
  • DELETE
    서버의 특정 리소스를 삭제합니다.

 

HTTP 상태 코드

HTTP 상태 코드는 서버의 응답 상태를 나타냅니다. 이를 통해 클라이언트는 요청이 성공적으로 처리되었는지, 에러가 발생했는지, 추가적인 동작이 필요한지 등을 알 수 있습니다.

 

상태 코드는 100, 200, 300, 400, 500 등의 범위로 나누어져 있으며, 각 범위가 나타내는 의미는 다음과 같습니다.

  • 100번대
    정보 제공. 클라이언트의 요청이 수신되었으며, 서버가 계속해서 처리하고 있음을 알립니다.
  • 200번대
    성공. 클라이언트의 요청이 성공적으로 처리되었음을 알립니다.
  • 300번대
    리다이렉션. 클라이언트가 요청을 완료하기 위해 추가적인 작업을 해야 함을 알립니다.
  • 400번대
    클라이언트 오류. 클라이언트가 잘못된 요청을 보냈음을 알립니다.
  • 500번대
    서버 오류. 서버가 정상적인 요청을 처리하지 못했음을 알립니다.

 

주요 상태 코드는 다음과 같습니다.

  • 200 OK
    요청이 성공적으로 처리되었습니다.
  • 201 Created
    요청이 성공적으로 처리되었고, 새 리소스가 생성되었습니다.
  • 204 No Content
    요청이 성공적으로 처리되었지만, 반환할 내용이 없습니다.
  • 301 Moved Permanently
    요청한 리소스가 영구적으로 새 위치로 이동되었습니다.
  • 400 Bad Request
    서버가 요청을 이해할 수 없습니다.
  • 401 Unauthorized
    인증이 필요합니다.
  • 403 Forbidden
    서버가 요청을 이해했지만, 특정 이유로 인해 수행을 거부합니다. e.g. 인증 실패, 권한 부족, 법적 제한, 서버 설정, 정책 등
  • 404 Not Found
    요청한 리소스를 서버에서 찾을 수 없습니다.
  • 500 Internal Server Error
    서버에 오류가 발생하여 요청을 처리할 수 없습니다.
  • 502 Bad Gateway
    서버가 게이트웨이나 프록시 역할을 하면서, 상위 서버로부터 유효하지 않은 응답을 받았습니다. 즉, 서버가 다른 서버에게 요청을 전달하려 했으나 그 서버로부터 적절한 응답을 받지 못한 경우에 발생합니다. 예를 들어 상태 코드가 200 범위가 아닌 응답, 비정상적으로 긴 시간이 걸리는 응답, 아예 응답이 없는 경우 등을 의미할 수 있습니다.
  • 503 Service Unavailable
    일시적으로 서버가 요청을 처리할 수 없습니다.

 

HTTP 헤더

HTTP 헤더는 클라이언트나 서버가 요청이나 응답에 추가적인 정보를 넣어 전달할 수 있게 합니다. HTTP 헤더는 크게 요청 헤더응답 헤더로 나눌 수 있습니다. 각 헤더는 특정 정보를 전달하는 데 사용되며, 다양한 종류가 있습니다.

 

요청 헤더의 예시는 아래와 같습니다.

GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0

 

일부를 살펴보겠습니다.

 

  • GET /home.html HTTP/1.1
    요청 라인으로, HTTP 메서드, 요청 대상,  HTTP 버전을 나타냅니다.
  • Host
    요청이 보내지는 서버의 호스트 이름을 나타냅니다.
  • User-Agent
    클라이언트의 소프트웨어 환경을 나타내는 식별자입니다.
  • Accept
    클라이언트가 이해할 수 있는 컨텐츠 유형을 나타냅니다.
  • If-Modified-Since
    이 시간 이후로 리소스가 수정되었을 때만 리소스를 반환하도록 서버에 요청합니다.
  • If-None-Match
    이전에 받은 응답의 ETag 값과 비교하여, 리소스가 변경되지 않았을 때 304 Not Modified 응답을 반환하도록 서버에 요청합니다.

 

응답 헤더의 예시는 아래와 같습니다.

200 OK
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Mon, 18 Jul 2016 16:06:00 GMT
Etag: "c561c68d0ba92bbeb8b0f612a9199f722e3a621a"
Keep-Alive: timeout=5, max=997
Last-Modified: Mon, 18 Jul 2016 02:36:04 GMT
Server: Apache
Set-Cookie: mykey=myvalue; expires=Mon, 17-Jul-2017 16:06:00 GMT; Max-Age=31449600; Path=/; secure
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
X-Backend-Server: developer2.webapp.scl3.mozilla.com
X-Cache-Info: not cacheable; meta data too large
X-kuma-revision: 1085259
x-frame-options: DENY

 

일부를 살펴보겠습니다.

 

  • 200 OK
    상태 라인으로, 요청이 성공적으로 처리되었음을 나타냅니다.
  • Access-Control-Allow-Origin
    웹 페이지가 다른 도메인의 리소스에 접근할 수 있도록 CORS(Cross-Origin Resource Sharing) 정책을 설정합니다.
  • Content-Type
    본문의 콘텐츠 타입을 알려줍니다.
  • Date
    응답이 생성된 날짜와 시간을 나타냅니다. 이 헤더는 응답의 신선도를 판단하는 데 도움이 됩니다.
  • Server
    응답을 생성한 웹 서버의 정보를 나타냅니다.
  • Set-Cookie
    클라이언트에게 쿠키를 설정하도록 지시합니다. 이 헤더는 클라이언트의 상태 정보를 저장하고, 이후 요청에서 이 정보를 다시 서버에 전송하는 데 사용됩니다.

 

Stateless 하다

HTTP는 Stateless 프로토콜입니다. 이는 각 HTTP 요청이 독립적이라는 것을 의미합니다. 서버는 이전 요청에 대한 정보를 기억하지 않으며, 모든 정보는 요청에 포함되어야 합니다. 이 덕분에 서버는 요청을 빠르게 처리할 수 있습니다. 하지만 클라이언트의 상태를 계속 추적해야 하는 경우(e.g. 로그인 상태) 서버에 추가적인 부하가 발생할 수 있습니다. 이때는 쿠키나 세션 등 다른 방법들을 사용할 수 있습니다.

 

HTTP vs HTTPS

웹사이트 주소를 가만히 보다 보면 HTTP 대신 HTTPS를 많이 보셨을 텐데요. HTTP와는 대체 뭐가 다른 걸까요? 그 차이점은 바로 '보안'입니다. HTTPS(HyperText Transfer Protocol Secure)는 HTTP에 Secure(보안)이 추가된 프로토콜인데요. SSL(Secure Sockets Layer) 또는 그 후속인 TLS(Transport Layer Security) 프로토콜을 사용하여 통신을 암호화합니다. 이를 통해 데이터가 전송 중에 감청되거나 변조되는 것을 방지하며, 서버와 클라이언트 간의 통신을 보호합니다.

HTTPS를 사용하면 다음과 같은 이점이 있습니다.

  • 정보의 보안
    HTTPS는 네트워크 상에서 정보가 안전하게 전송되도록 보장합니다. 이는 특히 민감한 정보(e.g. 신용카드 정보, 개인정보)를 다루는 웹사이트에서 중요합니다.
  • 신뢰성
    HTTPS를 사용하는 웹사이트는 사용자에게 신뢰성을 제공합니다. 사용자는 사이트가 그들의 정보를 안전하게 다루고 있다는 것을 알 수 있습니다.
  • 검색 엔진 최적화(SEO)
    구글 같은 검색 엔진은 HTTPS를 사용하는 사이트를 더 높게 평가합니다. 따라서 HTTPS를 사용하면 검색 결과에서 더 높은 순위를 얻을 수 있습니다.

 

마치며

지금까지 HTTP에 대해서 알아봤는데요. HTTP는 웹의 핵심적인 요소로, 웹 상의 정보 교환에 있어 중요한 역할을 합니다. 이를 잘 이해하고 활용함으로써 보다 효율적이고 안전한 웹 서비스를 제공할 수 있습니다.

 

지적이나 다른 의견은 언제나 환영합니다 :D

감사합니다.

 

Reference

https://developer.mozilla.org/en-US/docs/Web/HTTP

https://en.wikipedia.org/wiki/HTTPS

'Web' 카테고리의 다른 글

웹 스토리지 이해하기  (0) 2024.03.05
HTTP 세션 이해하기  (1) 2024.02.20
HTTP 쿠키 이해하기  (0) 2024.02.13
REST API? 그게 뭔가요?  (0) 2024.02.06
웹 페이지 렌더링 방식: CSR, SSR, SSG 이해하기  (2) 2023.11.20