HTTP 모듈과는 별개로, 빌트인 모듈인 “URL 모듈”을 추가하면, request의 URL를 쉽게 파싱할 수 있다.

var http = require('http');
var url = require('url');
 
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  var q = url.parse(req.url, true).query;
  var txt = q.year + " " + q.month;
  res.end(txt);
}).listen(8080);

req.url을 url.parse() 메소드를 통해 파싱하고 그 결과를 q 객체에 담는다. q 객체는 URL 파라미터값을 필드로 가지고 있게 된다. txt 객체에는 파라미터명 year와 month 의 값이 들어가게 될 것이다.


URL 모듈의 구조

URL 모듈의 구조는 아래의 소스 코드를 통해 한번에 이해할 수 있다.

var url = require('url');

var adr = 'http://localhost:8080/default.htm?year=2017&month=february';
var q = url.parse(adr, true);
 
console.log(q.host); //returns 'localhost:8080'
console.log(q.pathname); //returns '/default.htm'
console.log(q.search); //returns '?year=2017&month=february'
 
var qdata = q.query; //returns an object: { year: 2017, month: 'february' }
console.log(qdata.month); //returns 'february'

q 객체에는 adr의 URL을 파싱한 결과를 가지고 있다. url.parse() 메소드의 반환 결과는 크게 4개의 하위 결과를 포함하고 있다.

  • q.host : URL의 도메인 네임 => www.hotsse.me
  • q.pathname : 도메인 네임 이후의 경로명 => /bluelocking/index.html
  • q.search : 파라미터의 전부 => ?startDate=2017-10-21&endDate=2017-10-28
  • q.query : q.search의 결과를 파싱하여 필드로 가지고 있는 객체의 형태이다.

URL 모듈을 활용한 간단한 파일서버

URL 구조를 파싱하여 이에 해당하는 파일(HTML, 문서, 자료 등)에 연결해주는 파일 서버를 제작하려 한다. 앞의 메모들을 이해하고 있다면, 상당히 간단한 구조의 서버지만, 그런 만큼 보안에는 상당히 취약한 구조이기 때문에, 학습용으로만 사용하고 실 서버로는 사용을 권장하지 않는다.

var http = require('http');
var url = require('url');
var fs = require('fs');
 
http.createServer(function (req, res) {
  var q = url.parse(req.url, true); // URL 파싱
  var filename = "." + q.pathname; // 현재 디렉토리 기준의 파일 공
  fs.readFile(filename, function(err, data) { // 파일 시스템을 통한 파일 읽기
    if (err) { 
        // 읽기 실패
        res.writeHead(404, {'Content-Type': 'text/html'}); // 404 에러
        return res.end("404 Not Found");
    }  
    //읽기 성공
    res.writeHead(200, {'Content-Type': 'text/html'}); // 200 OK
    res.write(data); // 문서 내용 작성
    return res.end();
  });
}).listen(8080);

req.url 을 파싱한 q 객체에서 pathname 필드를 통해, Client가 접근하고자 하는 파일 경로와 파일명을 알아내고 해당 파일이 존재할 경우 200 OK와 함께 파일의 정보를 HTML 형식으로 전송하며, 그렇지 않을 경우, 404 Not Found 에러를 띄운다.

앞에서 언급했던 것처럼, 이러한 방식의 웹(파일) 서버는 그 어떤 인증을 거치지 않고 서버 내 모든 파일에 접근이 가능하기 때문에, 절대 사용해서는 안될 방식의 서버이다.