티스토리 뷰
Node.js의 가장 중요한 용도 중 하나는 빠르게 HTTP나 HTTPS 서버를 구현하는 데 있다.
URL 처리
URL(Uniform Resource Locator) 단일 자원 위치지정자는 HTTP 서버가 클라이언트의 요청을 처리하는데 사용하는 주소와 같은 역할을 한다. Node.js에서는 URL 정보를 효율적으로 사용하기 위해 url 모듈을 사용한다. 이는 URL 문자열을 URL 객체로 변환하는 기능을 한다.
//아래는 URL 문자열을 파싱해 객체로 만든 후 다시 문자열로 변환하는 예이다.
var url = require('url');
var urlStr = 'http://user:pass@host.com:80/resource/path?query=string#hash';
var urlObj = url.parse(urlStr, true, false);
/*url.parse에서 2번째 인자는 URL의 질의 문자열이 문자열 객체로 파싱된 경우
* Boolean값 true를 갖는다.
* 3번째 인자는 URL경로 값이 각각의 객체로 저장되는 경우 true를 갖는다.*/
urlString = url.format(urlObj)
//url.format을 통해 URL 오브젝트를 문자열 객체로 변환 가능하다.
URL의 문자열을 조작할 수 있는데
url.resolve(from, to)를 통해서 원하는 문자열로 변경가능하다.
http.ClientRequest 객체
ClientRequest 객체는 HTTP 클라이언트 구성을 위해 http.request() 호출시 내부적으로 생성된다.
이 객체는 서버 연결 요청 과정에서 요청 정보를 표현하는데 사용된다.
ClientRequest 객체는 writable 스트림으로 구성돼 있어서 writable 스트림 객체의 모든 기능을 제공한다.
http.request( options, callback)
option 전달인자는 클라이언트 HTTP 요청을 열고 서버에 전송하는 방법에 대한 속성을 지정한다.
callback 전달인자는 서버에 요청이 보내진 후 불리게 되는데, 서버로부터 받은 응답을 처리한다.
http.ServerResponse 객체
HTTP 서버는 request 이벤트 수신 시 내부적으로 ServerResponse 객체를 생성한다.
이 객체를 이용해 클라이언트 요청에 대한 응답을 정형화해 보낸다
http.IncomingMessage
HTTP 서버나 클라이언트는 IncomngMessage 객체를 생성한다. 서버 단에서는 클라이언트의 요청이 IncomingMessage 객체가 되고 클라이언트 단에서는 서버의 응답이 IncomingMessage 객체가 된다.
클라이언트와 서버의 IncomingMessage 객체가 동일한 이유는 양 단의 기본 동작이 동일하기 때문이다.
HTTP Server 객체
HTTP 서버를 구현하는 데 기초가 되는 프레임워크를 제공한다.
GET방식 Server / Client
/*동적으로 GET 요청을 처리하려면 클라이언트의 요청에 대한 동적 데이터 구성에 필요한 요청
핸들러를 구현하고 응답 데이터를 작성한다.
* GET - (가져오기, 조회용) 어떤 정보를 가져올 때 URL에 변수를 포함시켜 요청
* 데이터가 헤더에 포함되어 전달된다.
* URL에 데이터가 노출되고 길이 제한이 있다.
* 캐시될 수 있다.
* 서버에서 어떤 데이터를 가져와서 보여주는 정도(게시판)
* EX) URL?변수명1=값1&변수명2=값2&변수명3=값3&… , /hello/test.php?name1=value1&name2=value2
*/
var http = require('http');
var messages = [
'Hello World',
'From a basic Node.js Server',
'Take Luck'];
/*HTTP Server는 지정된 포트에서 수신하고 요청을 받은 후 연결된 클라이언트에 응답을 보낸다
* Server 객체는 EventEmitter를 구현해 이벤트를 방출한다.
* request - 서버가 클라이언트 요청 수신 시 매번 발생하며 클라이언트의 요청을 표현하는
* IncomingMessage객체와 전송할 응답에 관한 ServerResponse객체를 담은 콜백을 가진다
* connection - 새로운 TCP 연결 수립 시 발생
* close - 서버 종료 시 발생 */
/*http.createServer([requestListener]) 함수를 사용해 server객체를 생성하고 반환하게 된다.
* requestListener 는 IncomingMessager 객체와 응답을 구성하고 전송하는 ServerResponse 객체를 가진다.
* ServerResponse 객체는 request 이벤트 수신시 ServerResponse객체를 내부적으로 생성하고 이 객체를 이용해서
* 클라이언트 요청에 대한 응답을 정형화해 보낸다.*/
http.createServer(function (req, res){
res.setHeader("Content-Type", "text/html");//req에 대한 res 전송
res.writeHead(200);//statusCode의 이유
res.write('<html><head><title>Simple HTTP Server</title></head>');
res.write('<body>');
for(var idx in messages){
res.write('\n<h1>' + messages[idx] + '</h1>');//messages 객체를 for문을 통해 반복
}
res.end('\n</body></html>');//응답 마무리
}).listen(8080);//서버 객체를 생성한 후 listen() 함수를 호출해 요청을 수신한다.
Client
var http = require('http');
var options = {
hostname:'localhost',
port: '8080'
};
function handleResponse(response){//서버의 응답을 받았을 때 발생하는 response 이벤트
var serverData = '';
response.on('data', function (chunk){//'data' 이벤트 이름, 타입 , on 메소드는 이벤트를 연결하는 메소드
serverData += chunk;
});
response.on('end', function(){
console.log("Response Status:", response.statusCode);
console.log("Response Headers:", response.headers);
console.log(serverData);
});
}
/*ClientRequest 객체는 HTTP 클라이언트 구성을 위해 http.request() 호출 시 내부적으로 생성된다.
* 이 객체는 서버 연결 요청 과정에서 요청 정보를 표현하는데 사용된다.\
* option - HTTP 요청을 열고 서버에 전송하는 방법에 대한 속성
* callback 서버 요청이 보내진 후, 서버로 부터 받은 응답을 처리*/
http.request(options, function(response){//1
handleResponse(response);
}).end();
POST방식 Server / Client
/*post서버는 폼 형태로 서버에 갱신될 내용을 전송하는데 편리하다
* post 요청을 처리하려면 post 본문 내용을 읽고 내용을 처리하는 요청 핸들러 코드를 구현해야한다
* post 방식(부치기, 제출용)
* 데이터가 본문(body)에 포함되어 전달됨
* url에 데이터가 노출되지 않음
* 캐시되지 않음*/
var http = require('http');
http.createServer(function (req, res){
var jsonData = "";
req.on('data', function (chunk){
jsonData += chunk;
});
req.on('end', function(){
var reqObj = JSON.parse(jsonData);
var resObj = {
message : "HELLO " + reqObj.name,
question: "ARE YOU A GOOD " + reqObj.occupation + "?"
};
res.writeHead(200);
res.end(JSON.stringify(resObj));
});
}).listen(8080);
Client
/**
* Created by Youngdo on 2016-01-14.
*/
var http = require('http');
var options = {
host :'127.0.0.1',
path: '/',
port: '8080',
method: 'POST'
};
function readJSONResponse(response){
var responseData = "";
response.on('data', function (chunk){
responseData += chunk;
});
response.on('end', function() {
var dataObj = JSON.parse(responseData);
console.log("Raw Response: " + responseData);
console.log("Message: " + dataObj.message);
console.log("Question: "+ dataObj.question);
});
}
var req = http.request(options, readJSONResponse);
req.write('{"name":"Bilbo,", "occupation":"Burglar"}');
req.end();https 서버와 https클라이언트
https 하이퍼텍스트 전송 프로토콜 보안(Hypertext Transfer Protocol Secure)은
HTTP클라이언트와 서버 간에 안전한 통신을 제공하는 통신 프로토콜이다.
HTTPS는 보안 기능을 확보하기 위해 전송층 보안/안전 소켓층 TLS/SSL 프로토콜 위에
HTTP를 구현한 것이다.
HTTPS는 두 가지 방식으로 보안 기능을 제공하는데
1. 단기간에 사용되는 세션 키 교환을 위해 장기간 사용되는 공개 키와 비밀 키를 사용해
클라이언트와 서버간 데이터 암호화를 진행한다.
2. 인증 기능을 통해 접속하려는 웹서버가 의도한 서버가 맞는지 확인해 중간자의 공격을
방지할 수 있다.
'node.js' 카테고리의 다른 글
8. Node.js에서 구현하는 소켓 서비스 (0) | 2016.01.26 |
---|---|
(express) 8. 폼 처리 (0) | 2016.01.18 |
(express) 3. express로 시간 절약 (0) | 2016.01.11 |
6. Node.js에서 파일시스템 접근 (0) | 2016.01.04 |
5. Node.js의 데이터 입출력 처리 (0) | 2015.12.29 |