04-1 HTTP 이해하기
웹 동작은 클라이언트에서 서버로 자료를 요청하고 서버에서 클라이언트로 요청한 자료를 보내는 방식으로 동작합니다. 인터넷이 등장하면서 같이 만들어진 클라이언트와 서버 간의 규칙을 HTTP 프로토콜이라고 합니다. 클라이언트에서 서버로 자료를 요청하는 것은 HTTP 요청, 서버에서 응답해 클라이언트로 자료를 보내는 것은 HTTP 응답이라고 합니다. 즉, 서버프로그래밍은 요청과 응답을 어떻게 처리할 것인지 결정하게 됩니다.
요청과 응답
클라이언트가 서버로 보내는 요청 메시지는 요청 헤더와 요청 본문으로 구성됩니다. 만약 '사이트 내용을 보여 줘'라고 요청했다면 요청 본문에는 사이트 주소가 들어 있고, 요청 헤더에는 사용하는 시스템 정보, 웹 브라우저 정보, 사용한 언어 등 다른 정보까지 함께 넣어서 서버로 보냅니다. 같은 방식으로 서버에서 클라이언트로 보내는 응답 메세지도 응답 헤더와 응답 본문으로 구성됩니다.응답 본문에는 브라우저 창에 보여 줄 텍스트나 이미지 같은 사이트 내용이 들어가고, 응답 헤더에는 현재 파일이 어떤 형식을 사용하는지 인코딩은 무엇인지처럼 파일과 관련된 기타 정보가 담겨 있습니다.
요청 헤더와 응답 헤더에는 여러 정보가 담겨 있지만 꼭 확인해야 할 정보는 일반 항목에 담겨 있습니다.
- 헤더 일반 항목 구성요소
요청 URL: 서버에게 어떤 정보를 요구하는 URL을 요청 URL이라고 합니다.
요청 메서드: 클라이언트에서 서버로 정보를 보내면서 그 정보를 어떻게 처리할 것인지 알려 줍니다. 요청 메서드를 요청 방식이라고도 합니다.
요청 메서드 | 설명 |
GET 메서드 | 서버에서 정보를 가져올 때 사용합니다. 예를 들어 구글 웹 사이트 URL을 입력해 서버로 보내거나 웹 사이트에 있는 링크를 클릭하면 GET 요청이 서버로 전송되고, 서버는 해당 URL의 문서를 응답으로 반환합니다. |
POST 메서드 | 서버에 데이터를 저장할 때 사용합니다. |
PUT 메서드 | 서버에 있는 데이터를 수정할 때 사용합니다. 예를 들어 서버에 이미 저장되어 있는 사용자 정보에서 일부를 수정할 때 PUT 메서드를 사용해 서버로 보냅니다. |
DELETE 메서드 | 서버에서 데이터를 삭제할 때 사용합니다. |
상태 코드: 클라이언트에서 보낸 요청이 성공했느지 여부를 알려 주는 세 자리 숫자 코드입니다. 프로그램을 작성할 때 상태 코드를 확인해서 요청이 성공했는지 여부를 알 수 있습니다.
코드 | 메시지 | 설명 | |
1xx | Informational | 계속 처리 중 | |
2xx | Successful | 요청 성공 | |
200 | OK | 요청이 성공적으로 처리되었습니다. | |
201 | Created | 요청이 성공적으로 처리되어 새로운 자료가 생성되었습니다. | |
204 | No Content | 요청이 성공적으로 처리되었지만 응답으로 반환할 내용이 없습니다. | |
3xx | Redirection | 다른 위치로 이동 | |
301 | Moved Permanentil | 요청한 데이터가 새 URL로 옮겨졌습니다. | |
4xx | Client Error | 클라이언트 오류 | |
400 | Bad Request | 클라이언트 요청이 잘못되었거나 유효하지 않습니다. | |
401 | Unauthorized | 권한이 없어 거절되었지만 인증을 다시 시도할 수 있습니다. | |
403 | Forbidden | 권한이 없어 거절되었고 인증을 시도하면 계속 거절됩니다. | |
404 | Not Found | 해당 데이터를 찾을 수 없습니다. | |
5xx | Server Error | 서버 오류 | |
500 | Internal Server Error | 서버에 요청을 처리하는 동안 오류가 발생했습니다. | |
503 | Service Unavailable | 요청한 서비스를 이용할 수 없습니다. |
원격 주소: 인터넷에서 서버에 접속하는 실제 주소인 IP 주소와 포트를 보여 줍니다. 예를 들어 다음처럼 서버의 IP 주소는 172.217.161.288이고 사용한 포트 번호는 443이라는 뜻입니다.
172.217.151.228: 443 경우 서버의 IP 주소: 포트번호
- IP주소와 포트
클라이언트와 서버 사이에 데이터를 주고 받는 통로를 소켓(socket)이라고 합니다. 소켓은 IP주소와 포트를 통해 서로 식별합니다. 예를 들어 택배 차량은 소켓 역할을 하고 물건을 받는 사람의 주소는 IP주소에 해당합니다. 몇 동 몇 호라는 구체적으로 지정하는 최종 도착지점인 집 호수는 포트라고 가정할 수 있습니다.
IP주소
인터넷 프로토콜 주소를 IP 주소라도 합니다. 서버는 IP주소를 통해 웹 페이지를 구분합니다. 하지만 IP주소는 네 자리 또는 여섯 자리 숫자로 구성되어 있어 모든 사이트의 IP 주소 자체를 기억하는 것은 거의 불가능해 기억하기 쉬운 사이트 주소인 도메인 이름을 사용합니다.
도메인 이름을 IP주소로 변환해주는 서버를 DNS(Domain Name System Serve) 서버라고 합니다.
포트
포트는 네트워크를 통해 넘겨받은 자료를 정확히 어느 위치로 배달할 것인지 정해 주는 역할을 합니다. 포트를 사용할 떄는 도메인 이름이나 IP주소 뒤에 콜론(:) 기호와 함께 포트 번호를 적습니다.
서버에서 사용하는 기본 포트 번호 | |
20,21 | FTP(파일 전송 프로토콜) |
25 | SMTP(이메일 발송) |
53 | DNS 서버 |
80 | 웹(HTTP) 프로토콜에서 기본으로 사용하는 포트 번호로 80번 포트는 생략해도 해당 포트로 접속 가능 |
110 | POP3(이메일 수신) |
443 | HTTPS |
04-2 HTTP 모듈로 서버 만들기
노드에서 기본적으로 제공하는 HTTP 모듈을 사용한 서버
- 서버 만들기- http.createServer([옵션][,콜백]) 함수: req 객체와 서버에서 받는 응답인 res 객체를 사용해 콜백 함수를 작성합니다.
- 서버 실행하기 - server.listen(포트[,호스트][,콜백])
const http = require("http");
// 요청이 생겼을때 콜백 함수가 실행
const server = http.createServer((req,res)=>{
console.log("요청 발생");
});
// 서버 실행 상태 유지
server.listen(3000,()=>{ // server은 리스닝하는 서버를 지정 // 호스트는 listen 함수에서 사용하는 IP주소를 가리키는데 하나의 컴퓨터에서 하니의 IP 주소를 사용할 떄는 IP주소를 지정하지 않아도 됨.
console.log("3000번 포트에서 서버 실행 중");
});
04-3 응답 객체
노드에서는 클라이언트에서 서버로 요청하면 요청(request) 객체가 만들어지고 서버에서 클라이언트로 응답할 때는 응답(response) 객체가 만들어집니다.
응답 객체는 헤더와 본문으로 구성되므로 헤더를 만드는 것과 본문을 만드는 것을 고려합니다. 또 요청에 대한 응답이 끝난 상태에서 서버와 계속 연결하고 있을 필요가 없으므로 응답이 끝난 후에는 응답을 종료합니다.
- 응답 헤더 만들기
res.setHeader(이름,값) // 예시) res.setHeader("Content-Type","text/plain");
res.writeHead(상태코드[,상태 메시지][,헤더]) // 예시) res.writeHead(200,{"Content-Type":"text/plain"});
서버의 자료가 JSON일 수도 있고 텍스트일 수도 있으며, 헤더는 어떤 유형의 자료를 처리하는지, 서버의 상태는 어떠한지 알려 주기도 합니다. 응답 헤더를 만들 떄는 기본적으로 setHeader함수를 사용하지만, 상태코드를 헤더와 함꼐 기록하려면 writeHead함수를 사용합니다.
- 응답 본문 작성하기
res.write(내용[,인코딩][,콜백]);
res.end(내용[,인코딩][,콜백]);
응답 본문을 작성할 때는 write 함수를 사용합니다. 본문 내용만 지정할 수 도 있고 인코딩이나 콜백 함수를 함께 지정할 수 있습니다.
응답 내용을 모두 전당한 후에는 응답이 끝났다고 알려줘야 합니다. 클라이언트에게 더 이상 응답을 기다리지 않아도 된다고 알려 주기도 하고 더 이상 요청 처리를 하지 않아도 되도록 end 함수를 사용합니다. 인자 없이 사용할 수 도 있고 응답을 종료한 후에 표시할 내용이나 인코딩, 콜백 함수를 지정할 수 도 있습니다.
응답을 여러 번 나눠서 화면에 표시한다면 res.write함수를 여러 번 사용하고 마지막에 res.end함수를 사용해서 연결을 끊습니다.
const http = require("http");
const server = http.createServer((req,res)=>{
console.log(req.method); // 요청 메서드 확인
res.setHeader("Content-Type","text/plain"); // 응답헤더
res.write("Hello Node"); // 응답 본문
res.end(); // 응답 종료
});
server.listen(3000,()=>{
console.log("3000번 포트에서 서버 실행 중")
})
+) req.method를 실행할 때 결과에 GET이 2번 터미널에 출력되는 이유
URL을 요청하면 크롬 브라우저에서 파비톤을 함께 가져오기 때문입니다. 파비톤(FAVorite ICON)은 즐겨찾기에 추가할 때 사용하는 작은 아이콘을 말합니다.
![](https://blog.kakaocdn.net/dn/Ma3YE/btsFmkFGUPe/tkExVVqxwKBvtjgZl5f7I0/img.png)
04-4 라우팅 이해하기
웹 프로그래밍에서 라우팅이란 클라이언트에서 들어오는 요청에 따라 그에 맞는 함수를 실행하는 것을 말합니다.
요청 URL에 따라 다른 내용을 표시하도록 하는 합니다. 또한 GET,POST,PUT,DELETE 같은 요청 메ㅓ드에 따라 처리할 함수를 다르게 연결하기도 합니다.
const http = require("http");
const server = http.createServer((req,res)=>{
// 요청 메서드와 URL 가져오기
const {method, url} = req;
res.setHeader("Context-Type", "text/plain");
//URL에 따라 응답을 다르게 처리
if(method === "GET" && url === "/home"){
res.statusCode = 200;
res.end("HOME");
}
else if(method === "GET" && url === "/about"){
res,statusCode = 200;
res.end("ABOUT");
}
else{
res.statusCode =404;
res.end("NOT FOUND");
}
});
server.listen(3000,()=>{
console.log("3000번 포트에서 서버 실행 중");
});
위 내용은 DO IT Node.JS 입문 책을 참고하여 작성되었습니다.
'Node.js' 카테고리의 다른 글
K6 성능 테스트 (0) | 2024.04.02 |
---|---|
05. 노드와 비동기 처리 (0) | 2024.03.02 |
03. path, File System 모듈과 스트림 (0) | 2024.02.12 |
02.자바스크립트 기초 문법과 모듈 (1) | 2024.01.31 |
[서평] Do it! Node.js 프로그래밍 입문 (0) | 2023.11.27 |