검색

레이블이 webpack인 게시물을 표시합니다. 모든 게시물 표시
레이블이 webpack인 게시물을 표시합니다. 모든 게시물 표시

2020년 7월 26일

JWT ( JSON WEB TOKEN ) 인증환경에서 이미지 다운로드

서버 세션이 아닌 JWT 토큰을 기반으로 하는 웹 프로그램은 서버와의 통신이 필요하면 HTTP 헤더에 JWT 토큰을 포함하여  요청하고 서버는 클라이언트 요청 헤더의  JWT 토큰을 꺼내어 인증 정보를 꺼네어 사용하게 된다. 이미지의 경우는 어떻까 ? 

HTML 에서 img  태그는 JWT 와 같은 보안 토큰을 헤더에 포함하는 기능을 제공하지 않는다. 그러나 이미지 데이터를 스크립트에서 다운로드하고  data : image / FILETYPE; base64 URI 체계를 사용하여 이미지를 웹 페이지에 포함시키는 방법을 사용하면 간단하게 제한을 극복할 수 있다. ( vue-auth-image 모듈이나 관련 글들을 참고하는 것이 많은 도움이 되었다.) 



다수의 이미지를 다운로드 하는 경우 요청간 지연을 주기 위하여 아래와 같은 방법을 사용했다.
  var delay = 600 ;
  $("#grid figure img[is-secure]").each(function () {
    var $this = $(this);
    delay = delay + 50 ;
    $this.parent().addClass('is-loading');
    studio.ui.setSecureImage($this, delay);
  });
  
이미지를 가져오지 못하는 경우에는 재요청을 수행하도록 코드하였다.
  
  function setSecureImage(elemment, delay, callback) {
  var delay = delay || 1000;
  let url = elemment.attr("secure-image");
  setImageAsBase64(
    url,
    function (data) {
      elemment.attr("src", data);
      elemment.parent().removeClass("is-loading");
      if (isFunction(callback)) callback();
    },
    function () {
      let maxRetry = 3,
        retry = 0;
      if (defined(elemment.data("max-retry"))) {
        maxRetry = elemment.data("max-retry");
      }
      if (defined(elemment.data("retry"))) {
        retry = elemment.data("retry");
      }
      if (retry < maxRetry) {
        elemment.data("retry", retry + 1);
        sleep(delay);
        setSecureImage(elemment);
      } else {
        elemment.parent().removeClass("is-loading");
      }
    }
  );
  }

  async function setImageAsBase64(url, successHandler, errorHandler) {
  const headers = {};
  // JWT 토큰 값 설정
  Object.assign(headers, studio.services.accounts.authHeader()); 
  await axios
    .get(url, { headers: headers, responseType: "arraybuffer" })
    .then((response) => {
      var mineType = response.headers["content-type"].toLowerCase();
      var b64encoded = Buffer.from(response.data, "binary").toString("base64");
      var prefix = "data:" + mineType + ";base64,";
      if (isFunction(successHandler)) successHandler(prefix + b64encoded);
    })
    .then((error) => {
      if (isFunction(errorHandler)) errorHandler();
    });
  } 
  



아쉽지만 이미지를 다운로드하여 data 방식으로 설정하는데 있어 오류가 발생되어 다시 시도하도록 추가한 코드는 효용성이 없는 것 같다. 테스트 환경 이슈일 수도 있으나 다운로드에 있어 무작위로 오류가 발생하며 일단 오류가 발생되면 다시 시도한 경우 역시 오류가 발생한다. (→ 서버 이슈인지 코드 이슈인지는 확실하지 않다.)

참고자료

2020년 5월 24일

소문으로만 들어온 웹팩(webpack) 기반의 웹 프로그램 (PWA) 만들기

소문으로만 들어온 웹팩(webpack) 

웹팩은 오픈 소스 자바스크립트 정적 모듈 번들러(1) 로 여러개로 나누어져 있는 코드들을 사용되는 방식에 따라 분리하여 최적화하는 도구이다. 번들링을 통하여 파일은 합쳐지고 네트워킹 요청횟수는 줄어들게 되며 결과적으로 성능 향상을 가져오게 된다.

1) 번들링의 개념은 여러개의 파일 중에 종속성이 존재하는 파일을 하나의 파일로 묶어 패키징을 시키는 과정을 의미.


그림1. Dependency Graph with Webpack


webpack 기반의 개발을 위하여 bootstrap 4 를 기반으로 하는 반응형 Admin Template "Adminator" 를 사용하였다. 

그림2. Adminator


아쉬운점은 이용한 Adminator   가 webpack 3.8.1 를 기반으로 하고 있고 원개발자가 4.x 버전으로 업데이트 계획이 없다는 것이다. 4.x 부터는 속도 개선이 있다고 하던데 이를 확인하지 못한점이 아쉽다.

빌드 시간이 꽤나 소요되어 개발에 있어 상당한 불편함이 있었다. 다만 webpack-dev-server 사용하면 빌드과정 없이 실시간으로 수정된 웹 프로그램이 리로드되어 개발과정이 쉬워진다.

참고로 빌드를 위한 HW 사양은 아래와 같다.
  • MacBook Pro ( 15-inch, Mid 20154)
  • 2.5GHz 4Core Indel Core i7
  • 16G 1600MHz DDR3

웹팩에 대한 사전 지식없이 개발 

목표는 kendoui  기반으로 만들어진 관리자 웹 프로그램을 webpack 을 적용하여 개발하는 것이다.  이를 통하여 클라이언트와 서버를 완전하게 분리하여 성능적인 향상을 가져오는 것이 목적이다. 

Adminator 덕분에 webpack 에 대한 지식이 없었지만 큰 무리없이 시작할 수 있었으며 개발 과정에서 필요한 기술을 자연스럽게 습득할 수 있어 시간을 절약할 수 있었다. 



Adminator 에서 사용된 webpack 버전을 4.x 버전으로 변경하여 사용하여 보았다. 원작성자의 많은 부분을 수정해야 하는 이슈가 있어고 일부 HTML  내에서 자바 코드 처리하는 부분에있어 해결되지 않는 문제도 있다.  추가로 정리및 수정이 필요하다.



참고자료