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 프로토콜로 리소스를 제공할 수 있다.