Express.js Send file stream from URL

Express.js에서 다른 Static 서버의 파일을 전달하는 방법에 대해 알아본다

첫번째 방법

다른 Static 서버 파일의 스트림을 가져온 뒤 클라이언트에게 스트림
HTTP인 경우 http 사용, HTTPS는 https 사용
클라이언트는 Express에서 스트림을 받고 Express는 Static 서버에서 스트림을 받는다.

router.get('/', (req, res) => {
  const externalRequest = https.request({
    hostname: 'images.unsplash.com',
    path: '/photo-1652088070524-f39f6a26d36b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1287&q=80'
  }, (externalResponse) => {
    res.setHeader('content-disposition', 'attachment; filename=thumbnail.png');
    externalResponse.pipe(res);
  });
  externalRequest.end();
});

정상적으로 동작한다. 대신 스트림을 Express 서버가 중계하므로 레이턴시가 증가하는것을 확인할 수 있다.

CDN 사용하는 경우 위 방법으로 스트림을 전달하면 지리적으로 분산된 CDN 서버 사용의 이점이 상실된다.
*Express 서버가 지리적으로 분산되지 않았다는 가정

두번째 방법

Redirection 리다이렉션(302)
간단하지만 클라언트에서 Static 서버로 접근하는것도 동일하다. 클라이언트는 스트림을 Static 서버로 부터 받는다.

router.get('/', (req, res) => {
  res.redirect('https://images.unsplash.com/photo-1652088070524-f39f6a26d36b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1287&q=80');
});

Express 서버를 거치지 않고 Static 서버로 바로 접근하기 때문에 레이턴시가 상대적으로 작다.

결론

  • API(Express) 서버는 공개되어있으나 리소스 서버가 내부망에서만 접근이 가능한경우 첫번째 방법을 사용하여 외부에 리소스를 API를 통해 제공하면서 리소스 서버의 구성을 그대로 유지할 수 있다.
  • 리소스 서버가 HTTP 방식만 지원할 경우 클라이언트의 보안정책에 따라 접근이 불가할 수 있다.
    API(Express) 서버를 통해 HTTP/S 프로토콜로 리소스를 제공할 수 있다.

Leave a comment

Your email address will not be published.