- Published on
HTTP와 HTTPS
- Authors
- Name
- Inhwan Cho
HTTP(HyperText Transfer Protocol)
는 월드 와이드 웹(www)에서 데이터를 주고받기 위한 프로토콜입니다.
즉, HTTP는 서버와 클라이언트 사이에서 HTML 문서나 이미지 같은 리소스를 전송하기 위해 사용됩니다.
다음으로 넘어가기 전에 인터넷과 월드 와이드 웹(www)의 차이점에 대해 간략하게 살펴보면,
인터넷은 전 세계 컴퓨터 네트워크들을 연결하는 기반 인프라
이며, 월드 와이드 웹은 이 인터넷을 통해 정보를 공유하고 접근하는 방법
중 하나입니다.
HTTP의 주요 특징
- 비연결성(Connectionless): 클라이언트가 요청을 보내고
서버가 응답을 한 후 연결이 끊깁니다.
이는 서버의 리소스를 효율적으로 사용할 수 있게 해줍니다.
- 무상태성(Stateless): 각 요청은 독립적이며 서버는
과거의 요청 상태를 기억하지 않습니다.
상태 정보가 필요한 경우에는 쿠키(Cookie)와 같은 기술을 사용하여 관리합니다.
HTTP 메소드
HTTP 프로토콜은 다양한 메소드를 제공하는데, 이를 통해 서버에게 어떤 동작을 할 것인지 명시할 수 있습니다.
- GET: 리소스를 조회합니다.
- POST: 리소스를 생성하거나 업데이트할 때 사용합니다.
- PUT: 리소스를 생성하거나 대체합니다.
- DELETE: 리소스를 삭제합니다.
HTTP 응답 상태 코드
HTTP 응답 상태 코드는 웹 서버가 클라이언트(예: 웹 브라우저)의 요청을 처리한 결과를 나타냅니다.
이 코드들은 특정 범위의 숫자로 구분되며, 각 범위는 요청 처리 결과의 다른 유형을 나타냅니다.
상태 코드 범위 | 카테고리 | 설명 |
---|---|---|
1xx | 정보 응답 요청을 받았으며 프로세스를 계속한다. | |
2xx | 성공 요청이 성공적으로 받아들여지고 처리되었다. | |
3xx | 리다이렉션 요청을 완료하기 위해 추가 작업 조치가 필요하다. | |
4xx | 클라이언트 오류 요청에 오류가 있어 서버가 요청을 처리할 수 없다. | |
5xx | 서버 오류 서버가 유효한 요청을 처리하지 못했다. |
상태 코드 | 설명 |
---|---|
200 | OK - 요청이 성공적으로 처리됨. |
201 | Created - 요청이 성공적으로 이루어지고 새로운 리소스가 생성됨. |
301 | Moved Permanently - 요청한 리소스가 영구적으로 새 위치로 이동됨. |
302 | Found - 요청한 리소스가 일시적으로 다른 주소로 이동됨. |
400 | Bad Request - 서버가 요청을 이해할 수 없음. |
401 | Unauthorized - 요청이 인증을 필요로 함. |
403 | Forbidden - 서버가 요청을 이해했지만, 접근을 거부함. |
404 | Not Found - 서버가 요청한 리소스를 찾을 수 없음. |
500 | Internal Server Error - 서버 내부 오류로 요청을 처리할 수 없음. |
503 | Service Unavailable - 서버가 일시적으로 요청을 처리할 수 없음(과부하나 유지보수 등). |
HTTP와 HTTPS
특징 | HTTP | HTTPS |
---|---|---|
보안 | 암호화되지 않음 | SSL/TLS를 통해 데이터가 암호화됨 |
포트 | 기본 포트 80 | 기본 포트 443 |
성능 | 데이터 암호화/복호화 과정이 없어 빠른 편 | 암호화 추가로 약간의 성능 저하 가능 |
접두사 | http:// | https:// |
사용 목적(예시) | 검색 엔진에서의 일반적인 검색이나, 보안 요구 사항이 낮은 사이트에서 사용 | 개인 정보, 금융 거래, 로그인 정보와 같이 보안이 중요한 데이터의 전송에 사용 |
예시: HTML 폼 데이터 전송
<!DOCTYPE html>
<html>
<head>
<title>HTTP Form Example</title>
</head>
<body>
<form action="/submit_form" method="POST">
<label for="name">이름:</label>
<input type="text" id="name" name="name">
<input type="submit" value="제출">
</form>
</body>
</html>
HTTP와 HTTPS의 헤더(header)
헤더 타입 | 설명 |
---|---|
일반 헤더 | 요청과 응답 양쪽에서 사용되며, 일반적인 정보를 담습니다. 예: Date, Cache-Control |
요청 헤더 | 클라이언트가 서버로 보내는 요청에 대한 정보를 담습니다. 예: User-Agent, Accept |
응답 헤더 | 서버가 클라이언트로 보내는 응답에 대한 정보를 담습니다. 예: Server, WWW-Authenticate |
엔티티 헤더 | 전송되는 리소스의 본문(바디)에 대한 정보를 담습니다. 예: Content-Type, Content-Length |
HTTPS 통신에서 사용되는 헤더는 기본적으로 HTTP 헤더와 동일합니다.
HTTPS의 보안 기능은 주로 SSL/TLS 핸드셰이크 과정에서 처리되며, 이 과정은 별도의 암호화된 채널을 통해 이루어집니다.
따라서, 일반적인 HTTP 헤더 필드 외에, 암호화 및 보안을 직접 다루는 특화된 HTTP 헤더가 추가되는 것은 아닙니다.
JavaScript에서 HTTP 요청
JavaScript에서 HTTP 요청을 보낼 때, fetch API
또는 XMLHttpRequest
를 사용하여 HTTP 요청 헤더를 설정하고 서버에 정보를 전송할 수 있습니다.
예시 -
fetch('https://example.com/data', {
method: 'POST', // 요청 메소드 지정
headers: {
'Content-Type': 'application/json', // 컨텐츠 타입 설정
'Authorization': 'Bearer your_token_here' // 인증 토큰 설정
},
body: JSON.stringify({
key: 'value',
anotherKey: 'anotherValue'
}) // 보내고자 하는 데이터
})
.then(response => response.json()) // 응답을 JSON으로 파싱
.then(data => console.log(data)) // 서버로부터 받은 데이터 처리
.catch(error => console.error('Error:', error)); // 에러 처리
HTTP/1.1과 HTTP/2 비교
기능 | HTTP/1.1 | HTTP/2 |
---|---|---|
다중화(Multiplexing) | 지원하지 않음. | 하나의 TCP 연결에서 요청과 응답이 순차적으로 처리됨. 지원함. 단일 TCP 연결에서 여러 요청과 응답을 동시에 병렬로 처리할 수 있음. |
헤더 압축 | 지원하지 않음. | 헤더가 항상 플레인 텍스트로 전송됨. 지원함. HPACK 압축 방식을 사용하여 헤더 데이터를 압축하여 전송함. |
서버 푸시 | 지원하지 않음. | 클라이언트가 명시적으로 요청한 리소스만 받을 수 있음. 지원함. 서버가 클라이언트에게 필요하다고 판단하는 리소스를 사전에 푸시할 수 있음. |
우선순위 설정 | 지원하지 않음. | 요청 처리 우선순위를 설정할 방법이 없음. 지원함. 클라이언트가 요청의 우선순위를 지정할 수 있어 리소스 로딩 최적화 가능. |
프로토콜 오버헤드 | 높음. | 각 요청/응답마다 새로운 TCP 연결이 필요하거나, 연결 재사용 시에도 순차 처리로 인해 지연 발생 가능. 낮음. 다중화, 헤더 압축 등으로 인해 전체적인 네트워크 오버헤드 감소. |
보안 | HTTPS 사용 시 암호화 가능하지만, 프로토콜 자체에는 포함되어 있지 않음. | HTTPS 사용이 사실상 표준. HTTP/2 구현 대부분이 SSL/TLS 암호화를 기본으로 사용. |