들어가며
이번 시간에는 웹 기반 커뮤니케이션의 표준으로 널리 채택되어 사용되고 있는 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
'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 |