[Node.js] HTTP, HTTPs
Node.js의 'http' 모듈은 HTTP 서버 생성 및 HTTP 요청 기능을 제공하는 핵심 모듈입니다. 이는 Node.js에서 웹 애플리케이션과 서비스를 구축하는 데 있어 기본적인 부분입니다. http 모듈이 일반적으로 사용되는 몇 가지 이유는 다음과 같습니다.
- HTTP 서버 생성:
- http 모듈을 사용하면 HTTP 서버를 쉽게 만들 수 있습니다. 단 몇 줄의 코드만으로 기본 서버를 만들 수 있습니다.
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello, World!\n');
});
const PORT = 3000;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});
2. HTTP 요청 처리:
- http 모듈을 사용하면 GET, POST, PUT, DELETE 등과 같은 다양한 유형의 HTTP 요청을 처리할 수 있습니다.
const http = require('http');
const server = http.createServer((req, res) => {
if (req.method === 'GET') {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('This is a GET request.\n');
} else if (req.method === 'POST') {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('This is a POST request.\n');
} else {
res.writeHead(405, {'Content-Type': 'text/plain'});
res.end('Method Not Allowed.\n');
}
});
const PORT = 3000;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});
HTTP 응답 처리:
- 헤더, 상태 코드 설정 및 클라이언트로 데이터 다시 전송을 포함하여 HTTP 응답을 제어할 수 있습니다.
3. Express 및 기타 프레임워크와의 통합:
- Express를 포함한 많은 웹 프레임워크는 'http' 모듈 위에 구축됩니다. Express는 'http' 모듈의 기본 기능을 계속 활용하면서 기능이 더 풍부하고 유연한 프레임워크를 제공함으로써 웹 애플리케이션 개발을 단순화합니다.
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello, World!');
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});
낮은 수준의 제어:
- http 모듈은 HTTP 프로토콜을 보다 세밀하게 제어할 수 있는 하위 수준 API를 제공합니다. 이는 높은 수준의 사용자 지정이 필요한 시나리오에서 유용할 수 있습니다.
내장 모듈:
- http 모듈은 Node.js 코어의 일부이므로 쉽게 사용할 수 있으며 추가 설치가 필요하지 않습니다.
'http' 모듈은 강력하고 기본 HTTP 서버를 구축하는 데 적합하지만 많은 개발자는 더 복잡한 애플리케이션에 Express와 같은 웹 프레임워크를 사용하는 것을 선호합니다. Express와 같은 프레임워크는 'http' 모듈 위에 구축되어 웹 애플리케이션 구축에 대한 추가 기능과 보다 구조화된 접근 방식을 제공합니다. 'http' 모듈을 직접 사용할지 아니면 프레임워크를 사용할지 선택하는 것은 프로젝트의 복잡성과 요구 사항에 따라 달라지는 경우가 많습니다.
HTTP 상태 코드
HTTP 상태 코드는 서버에 대한 클라이언트 요청에 대한 응답으로 서버가 반환하는 세 자리 숫자입니다. 각 상태 코드는 요청 결과에 대한 정보를 제공하여 요청이 성공했는지, 오류가 발생했는지, 클라이언트의 추가 조치가 필요한지를 나타냅니다. 상태 코드는 첫 번째 숫자를 기준으로 다양한 클래스로 그룹화됩니다. 다음은 기본 클래스와 일반적으로 사용되는 HTTP 상태 코드입니다.
1xx(정보 제공):
- 100 계속:
- 서버는 요청의 초기 부분을 수신했으며 클라이언트가 요청을 계속해야 함을 나타냅니다.
- 101개의 스위칭 프로토콜:
- 서버에서 사용 중인 프로토콜이 변경되었음을 알리고 클라이언트는 새 프로토콜로 전환해야 합니다.
2xx (성공):
- 200 확인:
- 요청이 성공했으며 서버가 요청한 데이터를 반환했습니다.
- 201 생성됨:
- 요청이 성공하여 새로운 리소스가 생성되었습니다.
- 204 내용 없음:
- 요청이 성공했지만 응답 본문에 보낼 추가 정보가 없습니다.
- 206개 부분 콘텐츠:
- 클라이언트가 보낸 범위 헤더로 인해 서버는 리소스의 일부만 전달하고 있습니다.
3xx(리디렉션):
- 300개의 객관식:
- 요청된 리소스는 각각 특정 위치를 가진 여러 가능성에 해당합니다.
- 301이 영구적으로 이동됨:
- 요청한 리소스는 영구적으로 새 위치로 이동되었으며 향후 요청은 새 URL을 사용해야 합니다.
- 302개 발견됨:
- 301호와 유사하나 일시적인 이전입니다. 클라이언트는 이 요청에 대해 새 URL을 사용해야 하지만 향후 요청에 대해서는 이전 URL을 계속 유지해야 합니다.
- 304 수정되지 않음:
- 클라이언트의 캐시된 리소스 사본은 여전히 유효하며 서버는 마지막 요청 이후 리소스를 수정하지 않았습니다.
4xx(클라이언트 오류):
- 400 잘못된 요청:
- 잘못된 구문, 잘못된 매개변수 또는 다른 클라이언트 오류로 인해 서버가 요청을 이해할 수 없습니다.
- 401 승인되지 않음:
- 클라이언트는 요청된 응답을 받으려면 자신을 인증해야 합니다. 이는 일반적으로 사용자가 로그인해야 함을 의미합니다.
- 403 금지:
- 클라이언트는 요청한 리소스에 접근할 수 있는 권한이 없습니다.
- 404 찾을 수 없음:
- 서버가 요청한 리소스를 찾을 수 없습니다.
- 405 메서드는 허용되지 않습니다:
- 요청한 리소스에는 요청 방식(GET, POST 등)이 지원되지 않습니다.
- 429 요청이 너무 많습니다:
- 사용자가 주어진 시간 동안 너무 많은 요청을 보냈습니다("속도 제한").
5xx(서버 오류):
- 500 내부 서버 오류:
- 서버가 어떻게 처리해야 할지 모르는 상황에 직면했음을 나타내는 일반적인 오류 메시지입니다.
- 501 구현되지 않음:
- 서버는 요청을 이행하는 데 필요한 기능을 지원하지 않습니다.
- 502 잘못된 게이트웨이:
- 서버가 게이트웨이 또는 프록시 역할을 하는 동안 업스트림 서버로부터 잘못된 응답을 받았습니다.
- 503 서비스를 사용할 수 없음:
- 서버가 요청을 처리할 준비가 되어 있지 않습니다. 일반적인 원인으로는 일시적인 과부하나 서버 유지 관리 등이 있습니다.
- 504 게이트웨이 시간 초과:
- 서버가 게이트웨이 또는 프록시 역할을 하는 동안 업스트림 서버로부터 적시에 응답을 받지 못했습니다.
이는 단지 몇 가지 예일 뿐이며,더 많은 상태코드가 존재합니다.
무조건 응답을 보내야 한다.
요청 처리 과정 중에 에러가 발생했다고 해서 응답을 보내지 않으면 안 됩니다. 요청이 성공했든 실패했든 응답을 클라이언트로 보내서 요청이 마무리되었음을 알려야 합니다. 응답을 보내지 않는다면, 클라이언트는 서버로부터 응답이 오길 하염없이 기다리다가 일정 시간이 지난 후 Timeout(시간초과)처리합니다.
HTTP의 성능 장점
HTTP(Hypertext Transfer Protocol)는 특히 웹 콘텐츠의 효율적인 전송과 관련하여 성능 측면에서 여러 가지 장점을 가지고 있습니다. 그러나 성능 고려 사항은 상황에 따라 달라질 수 있으며 프로토콜 선택은 특정 사용 사례에 따라 달라질 수 있다는 점에 유의하는 것이 중요합니다. 성능 측면에서 HTTP의 몇 가지 장점은 다음과 같습니다.
- 무국적:
- HTTP는 상태 비저장 프로토콜입니다. 즉, 클라이언트에서 서버로의 각 요청은 독립적입니다. 이러한 상태 비저장은 요청 및 응답 처리를 단순화하여 서버를 더 쉽게 확장할 수 있게 해줍니다.
- 캐싱:
- HTTP는 캐싱 메커니즘을 지원하므로 브라우저와 프록시 서버가 이전에 가져온 리소스를 로컬에 저장할 수 있습니다. 이렇게 하면 동일한 리소스의 중복 전송 필요성이 줄어들어 응답 시간이 향상되고 서버 로드가 줄어듭니다.
- 압축:
- HTTP는 콘텐츠 압축을 허용하므로 전송되는 데이터의 크기를 크게 줄일 수 있습니다. gzip 또는 deflate와 같은 압축 기술을 요청 및 응답 본문 모두에 적용할 수 있으므로 데이터 전송 속도가 빨라지고 대역폭 사용량이 줄어듭니다.
- 병렬성:
- HTTP를 사용하면 리소스를 병렬로 다운로드할 수 있으므로 브라우저가 서버에 여러 동시 요청을 할 수 있습니다. 이는 도메인 샤딩과 같은 기술을 사용하거나 여러 하위 도메인을 사용하여 도메인당 동시 연결 수 제한을 극복함으로써 달성됩니다. 병렬성은 리소스를 병렬로 가져와서 웹 페이지 로딩 속도를 높입니다.
- 지속적인 연결:
- HTTP/1.1에서는 단일 연결을 통해 여러 요청과 응답을 보낼 수 있는 영구 연결을 도입했습니다. 이렇게 하면 각 리소스에 대한 연결 설정 및 종료와 관련된 오버헤드가 줄어들어 성능이 향상됩니다.
- 범위 요청:
- HTTP는 범위 요청을 지원하므로 클라이언트가 리소스의 특정 부분만 요청할 수 있습니다. 이는 중단된 다운로드 재개 또는 미디어 콘텐츠 스트리밍과 같이 부분 콘텐츠가 필요한 시나리오에 유용합니다.
- 리디렉션 및 캐싱:
- HTTP는 리디렉션 응답 캐싱을 지원합니다. 캐시된 리디렉션을 사용하면 동일한 리디렉션 체인을 반복적으로 따를 필요가 없으므로 후속 요청에 대한 시간을 절약하고 대기 시간을 줄일 수 있습니다.
- 콘텐츠 전달 네트워크(CDN):
- CDN은 HTTP를 활용하여 지리적으로 분산된 서버 네트워크에 콘텐츠를 배포합니다. 이는 물리적으로 사용자에게 더 가까운 서버에서 콘텐츠를 전달하여 대기 시간을 줄이고 페이지 로드 시간을 개선하는 데 도움이 됩니다.
- 연결 풀링:
- HTTP/1.1의 연결 풀링을 사용하면 여러 요청이 하나의 지속적인 연결을 공유할 수 있습니다. 이렇게 하면 각 요청에 대한 새 연결 설정과 관련된 오버헤드가 줄어들고 성능이 향상됩니다.
- 스트리밍 및 파이프라이닝:
- HTTP/1.1에서는 요청 및 응답 스트리밍에 대한 지원을 도입하여 콘텐츠의 점진적인 렌더링을 가능하게 했습니다. 또한 파이프라이닝을 사용하면 응답을 기다리지 않고 여러 HTTP 요청을 보낼 수 있으므로 대기 시간이 줄어들어 성능이 더욱 향상됩니다.
- 효율적인 헤더 압축:
- HTTP/2에서는 헤더 정보가 보다 효율적인 알고리즘(HPACK)을 사용하여 압축됩니다. 이를 통해 헤더 필드의 크기가 줄어들고 후속 요청에서 중복되는 정보가 최소화되어 성능이 향상됩니다.
- 멀티플렉싱:
- HTTP/2는 멀티플렉싱을 지원하므로 단일 연결을 통해 여러 데이터 스트림을 동시에 보내고 받을 수 있습니다. 이 기능은 요청과 응답의 병렬성을 향상시켜 페이지 로드 속도를 높여줍니다.
HTTP는 여러 가지 성능 이점을 제공하지만 특정 제한 사항을 해결하고 최신 애플리케이션 및 요구 사항에 맞게 웹 통신을 더욱 최적화하기 위해 HTTP/2 및 HTTP/3과 같은 최신 버전의 프로토콜이 도입되었다는 점을 인식하는 것이 중요합니다. 사용할 HTTP 버전의 선택은 서버 지원, 네트워크 상태, 특정 애플리케이션 요구 사항 등의 요소에 따라 달라질 수 있습니다.
HTTP, HTTPS 차이
HTTP(Hypertext Transfer Protocol)와 HTTPS(Hypertext Transfer Protocol Secure)는 모두 World Wide Web을 통한 통신에 사용되는 프로토콜입니다. 이들 간의 주요 차이점은 HTTPS가 제공하는 보안 기능에 있습니다. 차이점을 자세히 살펴보겠습니다.
HTTP(하이퍼텍스트 전송 프로토콜):
- 일반 텍스트 통신:
- HTTP는 일반 텍스트 채널을 통해 작동합니다. 클라이언트와 서버 간에 전송되는 모든 데이터는 로그인 자격 증명, 양식 데이터 및 통신 내용과 같은 민감한 정보를 포함하여 일반 텍스트로 구성됩니다.
- 암호화 없음:
- HTTP는 암호화를 제공하지 않습니다. 이러한 암호화 부족으로 인해 도청, 중간자 공격, 데이터 변조 등 다양한 보안 위협에 취약해집니다.
- 공격 취약성:
- 데이터는 일반 텍스트로 전송되기 때문에 특히 보안되지 않은 네트워크를 통해 전송되는 경우 가로채기에 취약합니다. 이렇게 하면 공격자가 정보를 더 쉽게 캡처하고 조작할 수 있습니다.
- 포트 80:
- HTTP는 일반적으로 통신에 포트 80을 사용합니다. 예를 들어 'http://example.com'과 같은 URL은 포트 80에서 HTTP를 통한 통신을 의미합니다.
HTTPS(하이퍼텍스트 전송 프로토콜 보안):
- 암호화된 통신:
- HTTPS는 클라이언트와 서버 간에 안전하고 암호화된 통신 채널을 제공하도록 설계되었습니다. 이는 SSL(Secure Sockets Layer) 또는 그 후속인 TLS(Transport Layer Security)와 같은 암호화 프로토콜을 사용합니다.
- 데이터 무결성:
- HTTPS는 전송된 데이터의 무결성을 보장합니다. 즉, 데이터를 가로채더라도 탐지 없이는 쉽게 변조할 수 없습니다.
- 인증:
- HTTPS는 서버 인증을 위한 메커니즘을 제공합니다. 이를 통해 클라이언트는 의도한 서버에 연결되어 있는지 확인하여 중간자 공격의 위험을 줄일 수 있습니다.
- 포트 443:
- HTTPS는 일반적으로 통신에 포트 443을 사용합니다. 예를 들어 https://example.com과 같은 URL은 포트 443에서 HTTPS를 통한 통신을 의미합니다.
- 디지털 인증서 사용:
- 보안 연결을 설정하기 위해 HTTPS는 인증 기관(CA)에서 발급한 디지털 인증서를 사용합니다. 이러한 인증서는 서버의 신원을 확인하여 클라이언트가 합법적이고 신뢰할 수 있는 웹 사이트에 연결되어 있는지 확인합니다.
- 거래 보안:
- HTTPS는 온라인 뱅킹, 전자상거래 등 민감한 정보를 보호해야 하는 모든 상황과 같은 안전한 거래에 매우 중요합니다.
HTTP와 HTTPS 중에서 선택하기:
- HTTP를 사용하는 경우:
- 전송되는 정보는 민감하지 않습니다.
- 인증이나 암호화가 필요하지 않습니다.
- 성능은 보안보다 우선순위가 높습니다.
- 다음 경우에 HTTPS를 사용하세요:
- 로그인 정보나 개인정보 등 민감한 데이터가 전송되고 있습니다.
- 인증 및 데이터 무결성이 중요합니다.
- 보안 모범 사례를 준수해야 합니다.
요약하자면, HTTP와 HTTPS의 주요 차이점은 제공되는 보안 수준입니다. HTTPS는 암호화, 데이터 무결성 및 인증 기능을 추가하여 특히 민감한 정보를 처리할 때 웹을 통한 통신 보안에 필수적입니다. 모범 사례에 따라 웹사이트에서는 HTTPS를 사용하여 사용자 데이터의 개인정보 보호 및 보안을 보장하는 것이 좋습니다.