콘텐츠로 이동

프로젝트 빌드 과정에서 SourceMap 업로드하기

Guance은 현재 webpack 플러그인을 제공하여 웹 프로젝트 빌드 과정에서 해당 디렉터리의 SourceMap 파일을 간편하게 업로드할 수 있습니다. 복잡한 수동 업로드 과정을 해결해 줍니다.

참고: 현재는 웹 애플리케이션 업로드만 지원합니다.

준비 작업

  1. 해당 사이트의 OpenApi 도메인 주소를 획득합니다.
  2. Guance에서 해당 OpenApi에 필요한 API KEY획득합니다.
  3. Guance 플랫폼에서 웹 애플리케이션의 applicationId, env, version 정보를 획득합니다. 애플리케이션이 없다면 새 애플리케이션을 생성해야 합니다.
  4. 준비 완료.

Webpack

@cloudcare/webpack-plugin 설치

 npm install @cloudcare/webpack-plugin --D

webpack.config.js 파일의 plugins 옵션 수정

// ....
const { SourceMapUploadWebpackPlugin } = require("@cloudcare/webpack-plugin")
module.exports = ({ mode }) => ({
  //.....
  devtool: "hidden-source-map",
  plugins: [
    //.....
    new SourceMapUploadWebpackPlugin({
      applicationId: "xxxxx", //  Guance 애플리케이션 appid
      apiKey: "xxxxxxxx", // open apikey
      server: "https://console.xxx-xxx.cn",
      filepaths: ["dist/"], // 검색할 디렉터리, 파일 또는 파일 디렉터리 가능
      logLevel: "verbose", // 로그 출력 레벨, 필수 아님
      root: "dist/", // 상대 경로를 계산할 디렉터리 설정, 필수 아님
      env: "production", // Guance 애플리케이션의 env, 필수 아님
      version: "1.0.0", // Guance 애플리케이션의 version, 필수 아님
    }),
  ],
})

SourceMap WebpackPlugin 설정 설명

interface Options {
  /**
   *
   * sourcemap을 검색할 파일/디렉터리.
   * "extensions 구성" 목록과 일치하지만 "ignore 구성"과 일치하지 않는 모든 파일이 검색됩니다.
   * sourcemap JSON 또는 `//#sourceMappingURL=` 주석을 통해 생성된 파일 + 소스 맵 쌍을 찾은 후 소스 맵이 업로드됩니다.
   */
  filepaths: Array<string> | string

  /**
   * Guance 플랫폼에서 생성된 openApi Key입니다. 생성 방법은 (https://docs.guance.com/ko/management/api-key/open-api/#_1)을 참조하세요.
   */
  apiKey: string

  /**
   * Guance 플랫폼 OpenAPI 서비스
   */
  server: string
  /**
   * Guance RUM 애플리케이션에 해당하는 applicationId(필수)
   */
  applicationId: string
  /**
   * Guance RUM 애플리케이션에 해당하는 version(필수 아님)
   */
  version?: string
  /**
   * Guance RUM 애플리케이션에 해당하는 env(필수 아님)
   */
  env?: string

  /**
   * 조건에 맞는 모든 파일 목록을 찾지만 파일을 업로드하지는 않습니다. 디버깅에 사용할 수 있습니다.
   */
  dryRun?: boolean

  /**
   * 업로드 후 발견된 모든 소스 맵 파일을 삭제합니다.
   */
  deleteAfterUpload?: boolean
  /**
   * 소스 맵이 sourceMappingURL을 통해 생성된 파일과 일치하지 않는 경우, 로컬 디스크의 파일 이름을 통해 일치를 시도합니다.
   */
  matchSourcemapsByFilename: ?boolean

  /**
   * 디렉터리에서 검색할 파일 확장자 목록
   * 기본값 [".js", ".map"].
   */
  extensions?: Array<string>

  /**
   * 무시할 파일 목록
   */
  ignore?: Array<string>

  /**
   * 상대 경로를 계산할 디렉터리를 설정합니다. sourcemaps 업로드의 상대 경로는 오류가 발생한 경로에 포함되어야 합니다. 따라서
   * 이 매개변수의 의미는 업로드할 상대 디렉터리를 제어하는 것입니다.
   * 기본값은 실행 디렉터리에서 검색 디렉터리까지의 상대 경로인 path.relative(process.cwd(), filepath)입니다.
   */
  root?: string
  /**
   * 디버깅 시 사용되며, 생성되는 로그의 레벨입니다.
   */
  logLevel?: "quiet" | "normal" | "verbose"
  /**
   * 실행 실패 시 오류를 무시할지 여부입니다. 이 설정을 사용하면 오류가 발생해도 컴파일 프로세스가 중단되지 않습니다. 기본값은 false이며, 기본적으로 오류가 정상적으로 발생합니다.
   */
  warnOnFailure?: boolean
}

프로덕션 환경에서 SourceMap의 가시성

프로덕션 환경에서는 보안상의 이유로 일반적으로 SourceMap 파일을 유지하지 않습니다. 이러한 파일은 개발자가 압축 또는 컴파일된 코드를 원본 소스 코드로 매핑할 수 있게 해주지만, 공개되면 애플리케이션의 내부 로직이 노출되어 보안 위험이 증가할 수 있습니다.

SourceMap을 안전하게 처리하려면 SourceMapUploadWebpackPlugin을 구성할 때 deleteAfterUpload: true 옵션을 활성화할 수 있습니다. 이렇게 하면 SourceMap이 서버에 업로드되는 즉시 로컬 파일 시스템에서 삭제되어 프로덕션 환경에 남지 않도록 보장합니다.

또한 Webpack의 devtool을 "hidden-source-map"으로 설정하면 JavaScript 파일에 해당 파일에 대한 참조를 포함하지 않고 SourceMap을 생성할 수 있습니다. 이렇게 하면 브라우저가 소스 코드를 다운로드하여 보려는 시도를 방지할 수 있습니다.

"hidden-source-map"이 활성화된 경우 SourceMapUploadWebpackPlugin 플러그인에서 matchSourcemapsByFilename: true도 설정해야 합니다. 이 구성은 생성된 코드에 명시적인 참조가 없더라도 플러그인이 JavaScript 파일 이름을 기반으로 해당 SourceMap 파일을 식별하고 업로드할 수 있도록 보장합니다.

이러한 조치를 통해 애플리케이션의 디버깅 편의성을 유지하면서도 소스 코드의 보안을 효과적으로 보호할 수 있습니다.

 const { SourceMapUploadWebpackPlugin } = require('@cloudcare/webpack-plugin')
 = require('@cloudcare/webpack-plugin')

module.exports = {
  // Ensure that Webpack has been configured to output sourcemaps,
  // but without the `sourceMappingURL` references in buidl artifacts.
  devtool: 'hidden-source-map',
  // ...
  plugins: [
    // Enable our plugin to upload the sourcemaps once the build has completed.
    // This assumes NODE_ENV is how you distinguish production builds. If that
    // is not the case for you, you will have to tweak this logic.
    process.env.NODE_ENV === 'production'
      ? [
          new SourceMapUploadWebpackPlugin({
            ...
            deleteAfterUpload: true,
            matchSourcemapsByFilename: true,
          }),
        ]
      : [],
  ],
}

디버깅 방법

실행过程中에 해당 SourceMap을 찾지 못한 경우, 환경 변수 DEBUG=sourcemap-upload를 설정하거나 logLevel: verbose를 구성하여 build 명령을 실행하면 구체적인 실행 로그를 확인할 수 있습니다.

주의사항

node 버전 > 10.13, webpack 버전 > 4

filepathsroot 구성 주의사항:

  1. Guance 콘솔에 오류 중 한 줄이 at SVGGElement.<anonymous> @ http://localhost:8000/js/chunk-vendors.732b3b98.js:1:93427와 같이 표시됩니다.

  2. 오류를 발생시킨 파일의 상대 경로는 js/chunk-vendors.732b3b98.js입니다.

  3. js 파일이 서버의 정적 디렉터리에 dist/js/*.js, dist/js/*.js.map로 위치하는 경우

  4. 플러그인 구성은 filepaths: ['dist']입니다.

  5. root를 구성하지 않은 경우 기본값은 dist/이며, 최종적으로 Guance 서버에 업로드되는 sourcemap 파일 경로는 dist/js/**.js.map입니다.

  6. 이 경우 업로드 파일의 디렉터리 경로오류가 발생한 경로가 일치하지 않게 됩니다. 따라서 이때는 root:'/' 또는 root: '' 구성을 추가하여 업로드되는 디렉터리 경로가 js/**.js.map이 되도록 보장해야 합니다.

문서 평가

이 페이지가 도움이 되었나요?