프로젝트 빌드 과정에서 SourceMap 업로드하기¶
Guance은 현재 webpack 플러그인을 제공하여 웹 프로젝트 빌드 과정에서 해당 디렉터리의 SourceMap 파일을 간편하게 업로드할 수 있습니다. 복잡한 수동 업로드 과정을 해결해 줍니다.
참고: 현재는 웹 애플리케이션 업로드만 지원합니다.
준비 작업¶
- 해당 사이트의
OpenApi도메인 주소를 획득합니다. - Guance에서 해당
OpenApi에 필요한API KEY를 획득합니다. - Guance 플랫폼에서 웹 애플리케이션의
applicationId,env,version정보를 획득합니다. 애플리케이션이 없다면 새 애플리케이션을 생성해야 합니다. - 준비 완료.
Webpack¶
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¶
filepaths와 root 구성 주의사항:¶
-
Guance 콘솔에 오류 중 한 줄이
at SVGGElement.<anonymous> @ http://localhost:8000/js/chunk-vendors.732b3b98.js:1:93427와 같이 표시됩니다. -
오류를 발생시킨 파일의 상대 경로는
js/chunk-vendors.732b3b98.js입니다. -
js 파일이 서버의 정적 디렉터리에
dist/js/*.js,dist/js/*.js.map로 위치하는 경우 -
플러그인 구성은
filepaths: ['dist']입니다. -
root를 구성하지 않은 경우 기본값은dist/이며, 최종적으로 Guance 서버에 업로드되는 sourcemap 파일 경로는dist/js/**.js.map입니다. -
이 경우 업로드 파일의 디렉터리 경로와 오류가 발생한 경로가 일치하지 않게 됩니다. 따라서 이때는
root:'/'또는root: ''구성을 추가하여 업로드되는 디렉터리 경로가js/**.js.map이 되도록 보장해야 합니다.