IT,프로그래밍/Node.js

[Node.js | PHP] php 페이지 와 nodejs 페이지 사이 데이터 전달

php 페이지 에서 nodejs 페이지로 데이터 전달

php 페이지 와 nodejs 페이지 사이 데이터 전달

오늘의 문제는 이거였다.(외않되…)

본인인증 서비스를 페이지에 이용하는데

이 서비스 모듈은 php 버전으로는 있지만, node js 로는 없어서 어떻게든 해결을 해야만 했다.

그 방법으로 생각해낸것이 Nodejs 페이지 에서 요청을 php 로 보낸뒤, php 페이지 에서 결과값을
만든뒤 그값만 nodejs 페이지 에서 가져오도록 하는것이었다.

말이어렵지만 정리하자면, 보이는건 nodejs로 만든 페이지(local) 이지만 nodejs 에서 전송하는데
필요한 값은 php로 만든 페이지 (다른 서버) 에서 가져와야하는 상황이었다.

NOTICE : 3줄 요약은 글 마지막에 있습니다.

문제점

여기서 또 흥미로운 문제가 터지는데 본인인증 모듈은 EUC-KR 페이지 였다(Oh GOD).
당연히 모듈을 통해 나온 결과값 역시 EUC-KR 형식이었고 말이다.

물론 Node.js 로 만든 페이지는 UTF-8 이었다.

그 결과 PHP 로 받아온 값의 이름부분이 죄다 깨지는 일이 발생한것…



즉 나는 2가지 문제를 동시에 해결해야했다.

  1. Node.js 로 된 페이지 에서 PHP 로된 페이지의 값 가져오기

  2. EUC-KR 로 된 데이터를 UTF-8 로 가공하기

해결법

1. Node.js 로 된 페이지 에서 PHP 로된 페이지의 값 가져오기

다른 백사이드 언어와 다른 HTTP 서버 간의 통신이었기에 고민이 많았지만 답은 2가지였다.

  1. Ajax 를 이용하여 브라우저 단에서 값 당겨오기

  2. request module 을 이용하여 통신으로 값 당겨오기

이 선택지중 나는 2번을 택했다(Ajax 도 공부해야하는데…)


우선 request module 을 npm 을 이용하여 설치해준다

npm install request

여기서 npm 이란 (Node Package Manager) 를 뜻한다.

-g 는 global install 이라는 뜻의 옵션인데.
NPM 에서는 local 과 global 두가지의 옵션이 있다.

local 은 주고 require 해서 쓰는것을 주로하고
global 은 명령을 입력해서 쓰는것들을 주로해준다.

이후 request 를 요청할 option 을 설정해준다.

const options = { //$enc_data 를 php 의 main 에서 가져오기 위한 옵션
url: 'http://111.0.0.1/MinjunKim/file.php',
method: 'POST',
json: true
};

그런다음 원하는 위치에 request 값을 가져온뒤 코딩을 해주었다

index.ejs

request.get(options, function (error, response, body) {
var row_data = body;
var row_datas = row_data.split('|');
if (row_datas[0]) {//실패한경우
res.render('error_chk', {
error_msg: row_datas[0]
});
} else { //정상적으로 가져온 경우
res.render('index', {
title: 'burning_camp',
post: false,
enc_data: row_datas[1]
});
}
});

file.php

(보안상 공개 못하는점 죄송합니다.)
.
.
.
// $returnMsg = 에러메세지, $enc_data = 필요 데이터들.
echo $returnMsg."|".$enc_data;

우선 나의경우 php 소스에서 결과 값을 echo 로 해서 html 상에서 1개만 나오도록 해주었습니다.

따라서 request 에서 var row_data = body; 로 가져왔을때 원하는 데이터만 가져올수 있었습니다.

이후, | 기호로 에러메세지와 필요데이터를 체크한뒤
에러메세지가 있으면 에러페이지로 라우팅해주고, 없으면 출력해서 보여줬습니다.

본인인증 모듈을 썼기에 보안상 소스노출이 안됩니다.


2. EUC-KR 로 된 데이터를 UTF-8 로 가공하기

한차례 고비를 넘긴후 잘되어가나 싶었더니만 Node.js 페이지 는 UTF-8 이지만 모듈이 달려있는
php 페이지 는 EUC-KR 이었고, 물론 모듈을 통해나온 결과값역시 EUC-KR 형식이었다…

NOTICE : 왜 EUC-KR 로 하냐? 라는 질문에는 저희가 쓰는 본인인증 솔루션 의 모듈이 EUC-KR
이었기에… 선택지가 없었고 Node.js 에 붙여서 하지못한것도 php 언어로 제공되었기에
이러한 해프닝이 벌어졌습니다…

따라서 처음에는 php 에서 iconv 함수를 써서 utf-8 로 인코딩해서 보내는 방식을 썼지만
가나다 를 보내면 #24728나#479328 와 같이 1글자 혹은 2글자 빼고는 글자가 깨지는 문제가
있었습니다.

그래서 데이터를 그대로 보낸다음에 Node.js 페이지 에서 인코딩을 하려했지만…
왜인지 패키지가 깔리질 않아서 실패했습니다(…)

그러던중 한가지 방법을 찾았는데 그것이 urlencode 함수 였습니다. 참고자료

따라서 가나다 를 우선 똑같이 iconv 함수로 형식을 UTF-8 로 바꾼다음에 urlencode 함수 로
변환해서 전송을하니까 하나도 깨지지 않게되었습니다 (드디어…)

<input type="hidden" name="returnMsg" value="<?= urlencode(iconv('euc-kr','utf-8',$returnMsg)) ?>">

그리고 마지막으로 node 에서 querystring 을 설치해서unescape해서 해결했습니다


설치 명령어 : npm install querystring

var err_Msg = qs.unescape(post.returnMsg);

추가로 name 은 result 값을 뜯어보니 UTF_8NAME 이라는 변수명으로 추가로 오는걸로 봐서
업체도 이 이슈에 관한 해결법을 이것으로한 모양이더군요.

마무리

결국 본인인증모듈을 사용하는데 성공했고, 저의 글이 node.js 로 만들어진 웹 페이지 에
본인인증 모듈(N**E) 을 사용할때 도움이 되었으면 좋겠습니다 ( 자료가 없더라구요…)

요즘 일이 바빠서 포스팅을 못했는데 종종 올리겠습니다!

3줄요약

  1. node 로 만든 페이지 에서 php 로 만든 페이지(타서버) 의 값을 가져올때는 request 패키지를 쓰자

  2. PHP 에서 EUC-KR 에서 UTF-8 로 바꾸는 함수는 incov 다.

  3. 서로 형식이 다른 페이지 (EUC-KR 에서 UTF-8) 로 보낼때는 그냥보내는것이 아닌 querystring 으로 만들어 보내주는게 좋다
    3-1 .PHP 에서 쿼리스트링 으로 만들어주는 함수는 urlencode
    3-2. Node.js 에서 쿼리스트링을 쓰고록 도와주는 패키지는 querystring 이다.