build 결과물에서 정보를 숨기고 싶을 때
2024. 7. 17. 18:39
반응형
npm library를 만들어서 배포했는데, 빌드 결과물인 index.es.js 파일에 숨기고 싶은 URL이 포함되어 있었다.
빌드 난독화를 해도, env파일에 변수를 넣어도 드러나는 건 당연히 그대로다.
(이게 노출된다고 해서 엄청 크리티컬 하진 않지만, 너무 적나라하게 드러나는 것이 불편한 상황)
// .env
VITE_SOCKET_URL=https://숨기고싶다.com
// socketInstance.ts
const url = import.meta.env.VITE_SOCKET_URL;
...
class SocketInstance {
private static instance: SocketInstance;
public socket: Socket;
private constructor() {
// env 파일에 들어있는 url 값을 불러옴
this.socket = io(url);
}
public static getInstance(): SocketInstance {
if (!SocketInstance.instance) {
SocketInstance.instance = new SocketInstance();
}
return SocketInstance.instance;
}
}
해결방법
우짜까 고민하다가, 암호화 복호화 개념을 활용해보기로 했다.
1) 기존 .env에 들어있는 "숨기고싶다.com" 변수를 .env.local 파일로 옮긴다.
2) preprocessEnv.js 파일을 새로 만들고, 빌드돌릴 때 이 파일을 거쳐가도록(?) 한다.
이 파일은 "숨기고싶다.com" 값을 가져와 암호화하고, 이걸 해독할 key값을 만들어주는 역할을 한다.
그 후 [.env.local에서 가져온 값을 암호화한 결과물 + key값]을 .env로 넘겨준다.
// preprocessEnv.js
import cryptoUtils from './utils/cryptoUtils.ts';
import fs from 'fs';
import dotenv from 'dotenv';
/* .env.local 파일에있는 오리지널socketURL */
dotenv.config({ path: '.env.local' });
const originalUrl = process.env.VITE_SOCKET_URL || '';
/* 암호화할 키값 생성 + 오리지널socketURL 암호화 */
const key = cryptoUtils.generateKeys().publicKey;
const encryptedUrl = cryptoUtils.encrypt(originalUrl, key);
/* 암호화된 socketURL을 .env파일에 저장 */
fs.writeFileSync('.env', `VITE_SOCKET_ENCRYPTED_URL=${encryptedUrl}\nVITE_SOCKET_KEY=${key}`);
3) package.json의 build에서 "tsx ./src/preprocessEnv.js" 부분을 추가한다.
// package.json
"scripts": {
...
"build": "rm -rf dist && tsc -p ./tsconfig.node.json && tsx ./src/preprocessEnv.js && vite build",
},
4) 실제로 "숨기고싶다.com"값을 가져다 사용하는 socketInstance.ts 파일에선 암호화된 값과 키값을 아래와 같이 가져다 쓰도록 한다.
const encryptedSocketUrl = import.meta.env.VITE_SOCKET_ENCRYPTED_URL || '';
const key: string = import.meta.env.VITE_SOCKET_KEY || '';
const decryptedSocketUrl = cryptoUtils.decrypt(encryptedSocketUrl, key);
...
class SocketInstance {
private static instance: SocketInstance;
public socket: Socket;
private constructor() {
// 복호화된 url값
this.socket = io(decryptedSocketUrl);
}
public static getInstance(): SocketInstance {
if (!SocketInstance.instance) {
SocketInstance.instance = new SocketInstance();
}
return SocketInstance.instance;
}
}
const P1 값이 기존에 "숨기고싶다.com" 이라고 적나라하게 드러나있는 부분이었는데, 이상한 string 값으로 대체되어 보인다.
(key값도 함께 들어있어서 뭐 마음먹으면 복호화할 수는 있겠지만, 난독화된 파일에서 저걸 굳이 까보는 노력을... 하려나?)
반응형
'한 걸음 > React & Next.js' 카테고리의 다른 글
[Next.js + Typescript] 컴포넌트 자체를 넘겨받아 렌더링하기 (0) | 2024.12.17 |
---|---|
[React] context API 기본구조 (0) | 2024.11.25 |
[npm] 라이브러리 배포 시, subpath로 깔끔하게 내보내기 (0) | 2024.06.21 |
[React] svg icon 컴포넌트화해서 사용하기 (0) | 2024.06.04 |
[styled-components + typescript] 커스텀 컴포넌트에 기본 attributes 가져오기 (0) | 2024.05.29 |