[번역] Making HTTP Requests in Node.js, #Haroopress


 sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js
  3. [번역] HTTP Authentication in Node.js
  4. [번역] Cloud Deployment of Node.js Applications with Nodejitsu
  5. [번역] Accessing the File System in Node.js

 원문 sitepoint.com의 Making HTTP Requests in Node.js

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Making HTTP Requests in Node.js

이전의 글에서 Node.js 서버를 만드는 것에 초점을 둔것은 HTTP 요청을 처리하기 위해서였다. 이번 글은 문제를 반대로 생각해서 당신의 Node.js 애플리케이션이 HTTP 요청을 어떻게 만들어 내는지를 보여줄 것이다. 아마 왜 그렇게 해야 하는지 의문이 들지도 모른다. 문득 떠오르는 애플리케이션이 두개 있다 - web scraping과 proxying. 스크래퍼는 웹페이지를 다운로드하고 계획에 따라 그것으로부터 정보를 추출하는 소프트웨어이다. 프록시 서버는 다른 서버에게 클라이언트의 요청을 전달하고 응답을 반환해주는 중개인과 같은 역할을 한다.

The Request Module

Node.js에서 HTTP 요청을 만드는 가장 간단한 방법은 request 모듈을 사용하는 것이다. Mikeal Rogers가 만든 request 모듈은 GET,POSTPUT, 그리고 DELETE를 포함한 모든 유형의 HTTP 요청을 만들게 해준다. 그러한 유연성이 request 모듈을 RESTful APIs로 상호작용하기에 적합하게 만든다. 다음의 npm 명령을 사용해서 request 모듈을 설치할 수 있다.

$ npm install request

request가 설치되었다면 아래 보이는 코드로 새로운 Node.js 파일을 만들어보자. 예제의 첫번째 라인에서 request 모듈을 프로그램 안으로 임포트하였다. HTTP 요청을 만드는 것은 간단하게 request() 함수를 호출하면 된다. 이 예제에서 우리는 sitepoint 홈페이지를 다운로드하기 위해 요청을 하고 있다. 물론, request()의 두번째 인자는 콜백 함수이다.

var request = require("request");
request("http://www.sitepoint.com", function(error, response, body) {
  console.log(body);
});

request()의 콜백 함수는 세개의 인자를 받는다 - errorresponse, 그리고 body. 이름을 보면 알수 있듯이 error는 HTTP 요청 중 발생하는 모든 문제에 관한 정보를 포함하고 있다. response 인자는 호출에 대해 반환되는 상태코드, 헤더 등 많은 것들을 포함한 다양한 데이터를 가지고 있는 객체이다. 세번째 인자인 body는 응답의 body이다. 앞의 예제에서 body는 sitepoint 홈페이지의 소스 코드를 포함하고 있다.

request 모듈은 HTTP 요청을 파일로 그리고 파일로부터 스트림하기 위해 파일 시스템 모듈과 결합을 할수도 있다. 다음 예제도 sitepoint 홈페이지를 가져 오는 것이다. 하지만, 콘솔에 소스코드를 보여주는 대신에 “sitepoint.htm”이라는 파일로 저장한다.

var request = require("request");
var fs = require("fs");
request("http://www.sitepoint.com").pipe(fs.createWriteStream("sitepoint.htm"));

Parameterizing Requests

앞의 예제들은 URL에 대해 간단한 GET 요청을 만들고 있다. 하지만 우리는 request()의 첫번째 인자로 설정 객체를 전달함으로써 HTTP 요청을 수정할 수 있다. 아래 예제 역시 sitepoint 홈페이지를 다운로드하는 것이지만 더 강력한 구문을 사용하고 있다. 숫자형의 설정 파라미터에 주의해야 하며 uri와 method 파라미터는 sitepoint에 GET 요청을 보내라고 request에게 알려준다.

var request = require("request");
request({
  uri: "http://www.sitepoint.com",
  method: "GET",
  timeout: 10000,
  followRedirect: true,
  maxRedirects: 10
}, function(error, response, body) {
  console.log(body);
});

timeout 파라미터는 응답을 포기하기전에 10,000 밀리초(10초)동안 기다리라고 request에게 알려주는 것이며, 마지막 두개의 파라미터는 리다이렉션 처리를 해준다. 많은 페이지들이 사용자가 인식하지 못하는 사이에 보이지 않게 리다이렉션을 수행한다. followRedirectmaxRedirects 파라미터는 3xx HTTP 리다이렉션을 최대 10개까지 처리하라고 request에게 알려준다. 또한, request()는 여기에서 보여주지 않은 다른 많은 파라미터들을 지원한다.

Submitting Form Data

앞에서 언급했듯이 request는 GET 요청뿐만 아니라 더 많은 것을 지원한다. 아주 일반적인것 중 하나가 POST 요청을 사용하여 폼 데이터를 제출하는 것이다. 다음 예제는 POST의 한 부분으로 사용자의 이름을 전송하기 위해서 request()의 form 파라미터를 사용한다. 그러면 PHP 페이지가 사용자에게 응답을 하는데 전송한 이름으로 인사 메시지를 보여줄 것이다.

var request = require("request");
request({
  uri: "http://www.cjihrig.com/development/php/hello_form.php",
  method: "POST",
  form: {
    name: "Bob"
  }
}, function(error, response, body) {
  console.log(body);
});

Dealing with Cookies

많은 사이트들이 쿠키를 사용해서 사용자와의 다양한 상호작용을 추적한다. 쿠키는 모든 HTTP 전송간에 클라이언트와 서버 사이에서 왔다 갔다 전송되는 작은 데이터 조각들이다. 쿠키의 사용을 용이하게 하기 위해서 request는 jar()와 cookie() 메서드를 제공한다. 다음 예제의 3 라인을 보면 사용자의 이름을 명시한 쿠키를 생성했다. 그 다음 2 라인에서 생성한 cookie jar에 그 쿠키를 추가했다. HTTP 요청을 만들때 jar 파라미터는 서버에 cookie jar를 전송하기 위해 사용된다.

var request = require("request");
var jar = request.jar();
var cookie = request.cookie("name=John");
jar.add(cookie);
request({
  uri: "http://www.cjihrig.com/development/php/hello_cookies.php",
  method: "GET",
  jar: jar
}, function(error, response, body) {
  console.log(body);
});

응답을 받게 될 때 사용자는 쿠키에 저장되어 있던 이름인 John으로 인사 메시지를 받을 것이다. cookie jar는 또한 서버에 의한 어떤 변화에도 업데이트가 된다. 요청을 보내기 전과 후에 cookie jar를 출력해 보면, 서버가 쿠키의 값을 “John”에서 “Stranger”로 변경한 것을 알 수 있다. 사이트와 사용자간에 실제 상호작용을 묘사하기 위해서 같은 cookie jar를 HTTP 요청에 연속으로 보낼수 있다.

Conclusion

이번 글에서는 간단하지만 강력한 request 모듈에 대해서 소개를 했다. 이번 글이 포괄적이지는 않기 때문에 request가 할 수 있는 다른 것들을 알아보기 위해서는 최소한의 문서들을 검색해봐야 할 것이다. 곧 나올 글에서 request를 더 심도있게 사용한 웹 스크래핑에 대해서 다룰 계획이니 계속 지켜봐 주길 바란다.

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, nodejs


[번역] Cloud Deployment of Node.js Applications with Nodejitsu, #Haroopress


 sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js
  3. [번역] HTTP Authentication in Node.js

 원문 sitepoint.com의 Cloud Deployment of Node.js Applications with Nodejitsu

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Cloud Deployment of Node.js Applications with Nodejitsu

오늘은 Nodejitsu를 사용하여 클라우드에 Node.js 애플리케이션을 배포하는 방법을 알아볼 것이다.

About Nodejitsu

뉴욕의 중심부에 본사가 있는 Nodejitsu는 클라우드 컴퓨팅을 서비스하는 기업이다. Node.js를 주력으로 platform as a service(PaaS)를 제공하고 있다. 또한 그들의 클라우드에 애플리케이션을 쉽게 배포할 수 있는 도구를 제공한다. 그리고 여러분들 자신의 하드웨어(시스템)에 Node.js 클라우드 서비스를 구축하기 위해 사용할 수 있는 Haibu(Japanese for hive)라는 무료 도구도 제공을 한다. 최소한 Haibu에 대해서 언급은 해야겠지만, 오늘은 Nodejitsu 프로덕션 스택을 위주로 이야기를 할 것이다.

Signing Up with Nodejitsu

Nodejitsu 클라우드를 사용하려면 계정을 등록해야 한다. 다행이도 Nodejitsu는 개인 개발자들에게는 무료로 제공할 계획이다. 계정 등록을 위해 Nodejitsu 홈페이지로 가보자. “Try Nodejitsu for free” 버튼을 찾아 클릭한다. 그리고, 새로운 사용자명을 생성하고 이메일 주소를 등록한다. Nodejitsu에 배포하려는 애플리케이션의 유형에 대한 설명을 선택적으로 추가할 수 있다.

등록신청이 제출되면 추가적인 설명이 있는 확인 이메일을 받게될 것이다. 당신은 jitsu라는 Nodejitsu의 명령행 유틸리티 모듈을 설치해야 한다. npm으로 jitsu를 설치하려면 다음의 명령을 사용해라. Unix 시스템상에서는 sudo를 사용해서 명령을 실행해야 한다.

$ npm install jitsu -g

다음으로 jitsu를 사용해서 당신의 계정을 확인하자. 당신이 받은 확인 이메일에는 아래 보이는 것과 유사한 명령이 포함되어 있어야 한다. 명령을 실행한 후에는 새로운 계정을 위한 비밀번호를 생성하라는 메시지가 나올 것이다. 비밀번호를 생성하면 이제 애플리케이션을 배포할 준비가 된 것이다!

$ jitsu users confirm your_username confirmation_code

Creating a Nodejitsu Application

sitepoint는 최근에 작성했던 글에서 Node.js 기반의 아주 기본적인 HTTP 서버를 만들었었다. 이 간단한 웹서버를 사용해서 우리의 첫번째 Nodejitsu 애플리케이션을 만들 것이다. 웹서버의 코드는 아래 보이는 것과 같다. 이 코드를 작성하고 “web_server.js”라는 이름으로 저장하자.

var http = require("http");
var server = http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/html"});
  response.write("<!DOCTYPE \"html\">");
  response.write("<html>");
  response.write("<head>");
  response.write("<title>Hello World Page</title>");
  response.write("</head>");
  response.write("<body>");
  response.write("Hello World!");
  response.write("</body>");
  response.write("</html>");
  response.end();
});
server.listen(80);

다음으로 jitsu를 사용해서 애플리케이션을 배포한다. 명령은 아래와 같다.

$ jitsu deploy

The package.json File

애플리케션이 배포되기 전에 “package.json” 파일이 필요하다. Node.js에서 프로젝트들은 프로젝트에 대한 메타 데이터를 명시한“package.json” 파일을 포함해야만 한다. 파일 확장자에서 알 수 있듯이 “package.json”은 JSON 데이터 형식으로 되어 있다. 일반적인 패키지 파일은 패키지 이름, 의존성 정보, 버전 정보, 그리고 기타 관련 설정 데이터를 포함할 것이다.

“package.json” 파일 없이 프로젝트를 배포하려고 하면, jitsu는 짧은 위저드(마법사)를 통해 몇단계를 거친 후 파일을 생성할 것이다. 아래 보이는 목록처럼 관련 위저드 데이터를 입력한다. App name은 애플리케이션 이름이고 애플리케시션에 접속하기 위해서는subdomain을 사용할 것이다. 따라서, subdomain은 당신의 사용자명을 포함해야만 한다. scripts.start 필드는 애플리케이션을 실행하는데 사용할 스크립트 파일을 가리킨다. version 필드는 애플리케이션의 버전을 표시하고, 마지막으로 모든 0.8 버전이 우리의 목적에 부합하기 때문에 engines.node의 값은 지정할 필요는 없다.

App name: web_server

subdomain: webserver.your_username

scripts.start: web_server.js

version: 1.0.0

engines.node: (0.8.x)

위저드가 끝나면 아래 보이는 것과 유사한 package.json 파일이 생성될 것이다.

{
  "scripts": {
    "start": "web_server.js"
  },
  "version": "1.0.0",
  "engines": {
    "node": "0.8.x"
  },
  "name": "web_server",
  "subdomain": "webserver.your_username"
}

마지막으로 설정을 확인하기 위해 yes를 입력한다.

Conclusion

모든 것이 정확히 설정됐다면 당신의 웹서버는 지금 Nodejitsu 클라우드에서 실행되고 있어야 하며 그 서버에는http://subdomain.jit.su 주소로 접속할 수 있다. 앞의 URL 중 subdomain은 “package.json” 파일의 subdomain 값으로 대신 사용해야 한다. 예를 들어 내 서버의 경우는 http://webserver.cjihrig.jit.su 주소를 사용한다.

물론 이것은 Nodejitsu의 빙산의 일각일 뿐이다. jitsu에 대해 실험해 보기를 바란다. 예를 들어 jitsu apps를 실행하면 당신의 애플리케이션들을 관리하기 위한 명령어들의 목록을 확인할 수 있다. Nodejitsu 핸드북도 확인해 보면 좋을 것이다.

우리 sitepoint 독자들 중 Nodejitsu에 대한 경험이 있는 사람이 혹시 있는지...?

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, node.js


[번역] HTTP Authentication in Node.js, #Haroopress


 sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js

 원문 sitepoint.com의 HTTP Authentication in Node.js(http://sitepoint.com/http-authentication-in-node-js/)

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

HTTP Authentication in Node.js

지난주 Creating a HTTP Server in Node.js에서 Node.js의 기본적인 HTTP에 대해서 알아 보았다. 오늘은 Node.js로 만든 사이트를 HTTP 인증을 사용하여 암호로 보호하는 방법을 보여줄 것이다. 먼저 기본접근인증(basic access authentication)에 대해서 살펴본 후 더 안전한 요약접근인증(digest access authentication)에 대해서 알아볼 것이다.

Basic Access Authentication

인증이 적용되어 있는 사이트에 사용자가 방문을 하면 사용자명과 비밀번호를 요구하는 입력창이 나타난다. 사용자가 유효한 자격증명(사용자명과 비밀번호)을 제공하면 페이지의 콘텐츠를 보게 되고 아니면 “401 Unauthorized” 응답으로 거부될 것이다. HTTP 인증의 가장 간단한 유형은 기본접근인증이다.

The Password File

서버측에는 모든 사용자명과 암호화된 비밀번호가 패스워드 파일에 저장되어 있다. Node.js의 유틸리티 모듈인 htpasswd는 패스워드 파일을 관리하는 데 사용할 수 있다. htpasswd를 설치하려면 아래의 명령어를 사용한다. npm은 Node.js Package Manager를 의미하며 Node.js에 기본적으로 설치되어 있다. 아래의 명령에서 npm은 Node.js 모듈을 설치하기 위해 사용하며 -g 플래그는 패키지를 전역적(시스템의 PATH 환경변수에 포함되어 있는)으로 설치하게 한다.

$ npm install -g htpasswd

일단 htpasswd가 설치되면 아래의 명령어를 사용하여 새로운 사용자를 생성할 수 있다. 이 예제는 -c 플래그를 사용하여 “htpasswd”라는 이름의 새로운 패스워드 파일을 생성한다. 새로운 파일에는 “foo”라는 이름의 사용자가 추가된다. -b 플래그는 명령행의 일부로 지정한 “bar”를 비밀번호로 설정하게 한다.

$ htpasswd -bc htpasswd foo bar

위 명령을 실행한 후 “htpasswd” 파일을 열어보자. “foo”라는 사용자에 대한 패스워드 파일 항목이 아래와 같이 보일 것이다. 이 행에는 사용자명과 암호화된 비밀번호가 포함되어 있으며 이것이 처음이자 유일한 사용자이기 때문에 파일에는 단 한줄만 있게 된다.

foo:{SHA}Ys23Ag/5IOWqZCw9QGaVDdHwH00=

Node.js Incorporation

다음 단계는 우리의 HTTP 서버에 인증이 지원되도록 추가하는 것이다. 우선은 다음에 나오는 npm 명령을 사용하여 http-auth 모듈을 설치해야만 한다.

$ npm install http-auth

다음으로 “basic_auth_server.js”라는 새로운 파일을 만들고 아래의 코드를 입력하자. 2 라인에서는 http-auth 모듈을 참조하고 있다는 것을 알 수 있다. 3 라인부터 7 라인까지를 보면 구성 객체를 인증 모듈로 전달하고 있다. authRealm 필드는 인증 영역을 정의한다.authFile 필드는 방금 만든 패스워드 파일을 가르킨다. 여기에서 __dirname은 현재 실행중인 스크립트가 존재하는 디렉토리를 참조한다. 이 예제에서는 “htpasswd” 파일이 “basic_auth_server.js”와 같은 디렉토리에 있다고 가정한다. authType 구성 필드는 인증에 사용하는 유형이 무엇인지를 나타낸다. 9 라인에서 기본인증 방식으로 HTTP 연결에 적용되었다. 인증 콜백 함수는 다음 처리를 위해 인증된 사용자명을 제공한다.

var http = require("http");
var auth = require("http-auth");
var basic = auth({
  authRealm: "Private area",
  authFile: __dirname + "/htpasswd",
  authType: "basic"
});
var server = http.createServer(function(request, response) {
  basic.apply(request, response, function(username) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello " + username);
    response.end();
  });
});
server.listen(80);
console.log("Server is listening");

마지막으로 서버를 시작한다. http://localhost 로 서버에 연결할 수 있다. 그러면 사용자명과 비밀번호의 입력창이 나타날 것이다. 앞에서 만든 자격증명을 제공하면 브라우저는 이름과 함께 인사(“Hello foo”)하며 응답할 것이다.

Limitations

기본접근인증의 가장 큰 단점은 자격증명(사용자명과 비밀번호)이 네트워크상에서 평문으로 전송된다는 사실이다. 이와 같은 유형의 인증은 감청을 막기 위해서 보안 연결(예: HTTPS)상에서만 사용해야 한다. 만약 보안 연결이 제공될 수 없다면 기본접근인증 대신에 더 안전한 형식의 인증을 사용해야만 한다.

Digest Access Authentication

요약접근인증은 기본인증에 대한 더욱 안전한 대안이다. 요약인증에서는 비밀번호가 네트워크 전송 전에 암호화된다.

The Password File

요약인증에서도 패스워드 파일을 사용한다. 하지만, 기본인증에서 사용하던 형식과 조금 다르다. 요약인증의 패스워드 파일 형식으로 운영하기 위해 htdigest라는 다른 유틸리티 모듈을 사용할 것이다. 다음의 npm 명령으로 htdigest를 설치하자.

$ npm install -g htdigest

다음으로 아래 보이는 명령어를 사용하여 새로운 패스워드 파일을 생성하자. 역시나 -c 플래그는 “htpasswd”라는 새로운 패스워드 파일을 생성하기위해 사용한다. 이제는 인증 영역 또한 명시해야만 한다. 이번 경우에는 인증 영역을 “Private area”로 지정한 것이다. 이 예제도 사용자명은 “foo”이다. 비밀번호를 명령행에서 직접 지정하지 않은 것을 주목하자. 명령을 실행하자마자 비밀번호를 요구하는 메시지가 나올 것이다.

$ htdigest -c htpasswd "Private area" foo

htdigest 명령을 실행한 후에 새로 생성된 “htpasswd” 파일의 내용을 확인해 보자. “foo”라는 사용자에 대한 항목이 아래처럼 보일 것이다. 요약인증 파일은 사용자명과 암호화된 비밀번호, 그리고 기본인증 파일에는 포함되지 않았던 인증 영역까지 포함하고 있다.

foo:Private area:b8e1b1c08abcd38173a7dba3ad93a0c3

Node.js Incorporation

서버에 요약인증을 통합하기 위해 우리는 다시 http-auth 모듈을 사용할 것이다. 이 튜토리얼을 잘 따라왔다면 그 모듈은 이미 설치가 되어있어야 한다. 다음은 서버를 구현하기 위한 “digest_auth_server.js”라는 새로운 파일을 생성하자. 서버의 코드는 아래 보이는 것과 같다. 이 서버 코드가 기본인증의 서버 코드와 거의 동일한 것을 주목하자. 차이점은 구성 객체의 authType 필드에 있다. 이 경우에는 authType이 “digest”로 설정되었다. 이 서버에도 기본인증 서버와 동일한 방식으로 접근할 수 있다.

var http = require("http");
var auth = require("http-auth");
var digest = auth({
  authRealm: "Private area",
  authFile: __dirname + "/htpasswd",
  authType: "digest"
});
var server = http.createServer(function(request, response) {
  digest.apply(request, response, function(username) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello " + username);
    response.end();
  });
});
server.listen(80);
console.log("Server is listening");

Conclusion

이번 글에서는 기본적인 HTTP 인증에 대해서 다루었다. 여기에서 제공하는 예제를 따라함으로써 여러분의 Node.js 애플리케이션들을 조금 더 안전하게 만들 수 있다. 하지만, 인증 하나만으로는 충분하지 않다는 것을 알아야만 한다. 만약 보안이 우선 관심사라면 여러분의 사이트는 HTTPS를 통해 서비스를 해야만 한다. 앞으로의 글들에는 HTTPS 및 여러 다른 놀라운 Node.js의 특징들에 대해서 살펴볼 것이다.

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, node.js