'node.js http request'에 해당되는 글 1건

node.js 가 클라이언트가 되어 서버에 요청을 보내는 경우 http request 모듈을 이용한다 .


예를 들어 학교 api에 정보를 요청하는 경우가 있다. 



//request 모듈 선언 

var request = require('request');


//api에 http request


var headers = {

    'User-Agent':       'Super Agent/0.0.1',

    'Content-Type':     "application/xml"

}

 //api get options.

 var options = {

 url : 'http://wise.uos.ac.kr/uosdoc/api.ApiUcrCultTimeInq.oapi',

 method:'GET',

 headers:headers,

 encoding:'binary',

 qs: {'apiKey': '201501195EQW98965','year':'2014','term':'A10','subjectDiv':'""'}

 };

console.log("Let's Start courseLoad");

//request 동작. 

request(options, function (error, response, body) {

    if(error) console.log("에러에러(wise 점검 및 인터넷 연결 안됨)");

    if (!error && response.statusCode == 200) {

    

     //받아온 데이터의 euc-kr 형식을 ut8로 변환

     var data = new Buffer(body, 'binary');

    

     var data_utf8 = euckr2utf8.convert(data).toString();

    

    

     //받아온 강의 데이터 xml 형식을 json으로 변환.

     var course_array = xm.load(data_utf8).root.mainlist.list;

     var dataSet= new Array(course_array.length);

     //받아온 데이터를 테이블 형식에 맞게  Array형식으로 변환.

for(var i=0;i<course_array.length;i++){

 dataSet[i]= new Array(4); 

 dataSet[i][0]=course_array[i].sub_dept.$cd;

 dataSet[i][1]=course_array[i].subject_div.$cd;

 dataSet[i][2]=course_array[i].subject_nm.$cd;

 dataSet[i][3]=course_array[i].prof_nm.$cd;

 dataSet[i][4]='<a href="/evaluate/'+course_array[i].subject_nm.$cd+"/"+course_array[i].prof_nm.$cd+'" class="btn btn-primary btn-xs" data-title="evaluate"><span class="glyphicon glyphicon-pencil"> 평가하기</span></a>'

};

    

    

     //Array를  클라이언트로 전송.

res.send(dataSet);

    

    }

});




여기서 중요한 것은 option 지정 부분이다. 


기본적인 내용으로 들어가서 http request 가 도대체 무엇인가를 알아야 하겠다.


HTTP_request.png

http request란 간단하게 이러한 그림으로 설명할 수 있다. 브라우저(클라이언트)에서 서버에 요청을 보내고 서버에서는 그 요청을 처리하여 뿌려주는 것이다. 그렇다면 우리가 구축하는 웹서버란 무엇일까? 


웹서버란  http(hypertext transfer protocol)프로토콜을 기반으로 웹페이지에 해당하는 파일을 클라이언트에게 전달하는 역할을 하는 서버이다.

node.js로 http프로토콜(통신규약)을 토대로 지금 껏 웹서버를 구축해 온 것이다. 


그렇다면 content-type Field는 무엇인가?  http는 클라이언트와 서버가 일정하고 예측가능한 방식으로 정보를 교환하고 상호작용 할 수 있도록 하는 Method와 Header의 집합을 정의하고 있다 . 


여기서 문제는 개발자가 직접 위의 코드와 같이 request 코드를 작성할 때 content-type option을 정확하게 이해하고 작성해야만 한다는 것이다. 아직은 이해가 잘 이해 되지 않는다.. get 방식과 post 방식에서의 content-type 설정? get 방식에서는 content-type을 설정하지 않고 요청을 보내는 것인가? post 방식에서만 content-type을 설정하여 보내는 데이터의 타입과 인코딩을 지정해 주는 것인가 ? 아직 잘 모르겠다. 일단 추후에 다시 공부한뒤 다시 포스팅을 해야겠다. 할일이 많다 ...



1. HTTP Header Content-Type Field란?



Content-Type이란 말 그대로 사용자 요청과 응답 메시지 타입을 뜻하며, 크게 Discrete-Type 과 Composite-Type으로 나뉩니다.


또한, 문법으로 아래와 같은 형태를 가집니다.




Content-Type(필드명): text(타입)/plain(서브타입); charset=us-ascii(파라메터)


Discrete-Type: 그 자체로 어떤 의미를 가지고 있는 Content-Type을 나타낸다.


예) "text" / "image" / "audio" / "video" / "application" / extension-token


Composite-Type: Discrete-Type 혹은 Composite-Type의 개체 여러 개가 복합되어 만들어진 타입을 나타낸다.


예)  "message" / "multipart" / extension-token




MIME Type 참고 사이트


http://www.iana.org/assignments/media-types/index.html






즉, 아래 그림의 Accept 필드는 응답 시 브라우저가 허용할 수 있는 메시지 타입을 가리키며, Content-Type은 그에 따른 응답 메시지 타입을 나타내는 것입니다.








2. HTTP란?



HTTP란 간단히 말해 웹 브라우저와 웹서버 간에 메시지 교환 프로토콜입니다. 즉, 일종의 대화 규칙이며, 교환 방식은 복잡한 바이너리 데이터가 아닌 단순 텍스트를 통해 이루어집니다.


위에서 설명한 Content-Type의 응답 메시지(html, xml, 등..)또한, 단순 텍스트로 교환되며, 


만약 누군가가 주고받는 네트웍 패킷을 가로채 볼 수 있다면, 메시지 내용이 그대로 보이게 되므로 보안상 치명적 결과를 가져올 수 있는 상황입니다.


즉, 컨텐츠 보안이 필요한 경우에는 HTTPS 프로토콜을 사용하여, 주고받는 네트웍 패킷을 알고리즘을 통해 모두 암호화 해야 할 필요가 있습니다.




3. HTTPS란?



HTTPS는 HTTP와 같은 통신 프로토콜이며, 쓰임새(메시지 전송) 또한, HTTP와 거의 흡사합니다.


하지만 HTTPS는 앞서 설명했던 HTTP의 취약점을 보완하기 위해 주고받는 모든 메시지를 암호화하며, 암호화 방식에 쓰이는 Key의 종류로는 크게 대칭과 비대칭 둘로 나뉘게 됩니다.


간단히 동작원리에 대해 설명하자면, 클라이언트(웹 브라우저)와 서버(웹서버)가 서로 교환한 세션키(대칭키)로 주고받는 모든 컨텐츠 내용을 암호화합니다.


즉, 중간에 네트웍 패킷을 가로챈다 해도 암호화된 내용이 노출되므로 보안상 안전하며, 공유된 세션키(대칭키)를 모르는 상황에서 암호화를 푼다는 것은 모든 경우의 키를 대입해야 한다는 말이 됩니다.


만약 1024 비트(보통은 128비트 암호화)의 암호화라면, 평균적으로 2의 512승을 대입해야하며, 이것은 2475880078570760000000000000.00이라는 수를 대입해야 한다는 뜻과 같습니다.


이 숫자는 아무리 빠른 컴퓨터(현재까지 나온..)라 할지라도 약 몇 천 년에 걸려 계산되어야 할 것 입니다.



위에서 설명한 내용 중 세션키 교환 동작과 같은 더 자세한 설명은 다음 포스트 주제인 SSL 동작원리에서 다루도록 하겠습니다.

'프로그램 > node.js' 카테고리의 다른 글

passport-local  (0) 2015.03.27
인코딩문제(iconv를 통한 해결)  (0) 2015.03.27
node.js http request 모듈  (0) 2015.03.27
node-gyp 관련에러  (0) 2015.03.27
npm install 관련 오류  (0) 2015.03.27
passport에서 세션과 쿠키  (0) 2015.03.27
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요