본문 바로가기
Javascript/Node.js

아마존 ELB 기반 서비스 사용시 node.js에서 http 주소로 접근시 https로 변환

by progrpsk 2018. 3. 20.

현재 일하고 있는 곳에서 아마존과 협업하여 시스템을 개발중에 있다.

최근 개발중인 앱을 아마존 서버에 올렸는데, http로 접근했을때 https로 변환해주는 기능을 구현해야했다.

아마존 관계자분께서 node.js 내의 코드를 수정하면 쉽게 해결된다고 하여 보내주신 링크 문서를 보았다.

결론적으로 해결했는데 코드는 아래와 같다.


app.get('*', function(req, res, next) {

//http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-proto

    if (req.get('x-forwarded-proto') != "https") {

        res.set('x-forwarded-proto', 'https');

        res.redirect('https://' + req.get('host') + req.url);

    } else {

        next();     

    }

});


이게 뭐냐면 req.get('x-forwarded-proto') 함수를 통해서 프로토콜을 확인해주고 그것이 https가 아닐때 https 주소로 리다이렉트 하라는 함수이다.

처음에 이것말고 아래의 함수를 이용했지만, 아마존 ELB 기반에서는 위의 함수만 동작한다고 한다..

(왜 그런지 모르겠는데, 아래 함수가 안되서 물어보니까 그렇다고 하신다..ㅅ.. 사실 더 자세히 들어가기는 싫어서 그 선에서 마무리했다.)


// 위의 함수와 같은 동작을 하지만 아마존 ELB 환경에서는 동작하지 않는 함수

function ensureSecure(req, res, next){

  if(req.secure){

    // OK, continue

    return next();

  };

  res.redirect('https://'+req.host+req.url); // handle port numbers if non 443

};


app.all('*', ensureSecure);


위 두 함수와 관련된 정보는 아래의 링크를 참고 바란다.


https://stackoverflow.com/questions/19046208/forwarding-http-to-https-in-node-js-express-app-using-ebs-elb-environment


여튼 누군가 아마존 서버를 이용하여 자신의 앱을 서비스하고자 한다면 위의 사항을 알아두는 것이 도움될 것이다.

(물론 나는 여기를 퇴사한다고 했을때 혼자서 아마존 서버를 운영할 일을 없겠지만요. 개인 서비스는 heroku 추천 ~.~)


댓글