📊 개요
넣은 파일의 수와 줄 수를 세요. 줄은 코드 줄(실제로 동작하는 줄), 주석 줄(사람에게 설명하는 줄), 빈 줄로 나눠 세요. 확장자로 언어(자바스크립트·타입스크립트·HTML·CSS·파이썬·Lua·JSON·마크다운 등)를 알아내서 언어별 비율을 막대로 보여 주고, 가장 긴 파일 목록도 보여 줘요.
node_modules, .git, dist, build처럼 남이 만들었거나 자동으로 만든 폴더, 그림·글꼴·압축 파일, 2MB가 넘는 파일, 잠금 파일과 .min.js는 건너뛰고 "건너뛴 파일" 목록에 이유와 함께 적어요.
🔑 비밀 정보 섞임
API 키·토큰·비밀번호·개인 키가 코드나 설정 파일에 그대로 들어 있는지 찾아요. 서비스마다 생긴 모양(예: AWS는 AKIA로 시작)과, password·secret·token 같은 이름에 뒤죽박죽한 값이 들어 있는지를 봐요. 찾은 값은 화면과 보고서 어디에도 그대로 보여 주지 않고 앞 4글자만 보여 줘요.
높음 AWS 열쇠가 코드에 있어요
왜 문제인가요? AWS 열쇠(Access Key)가 있으면 누구나 내 클라우드 계정으로 서버를 켜고 돈을 쓸 수 있어요. 코드가 한 번이라도 공개되면 몇 분 안에 자동 프로그램이 찾아내요.
고치는 법: ① 코드에서 바로 지워요. ② 이미 저장소(GitHub 등)에 올렸거나 남에게 보냈다면 새어 나갔다고 생각하고, 그 서비스에서 열쇠를 새로 발급(바꾸기)하고 옛 열쇠는 없애요. ③ 앞으로는 환경 변수나 .env 파일에 두고, .gitignore에 .env를 적어 올라가지 않게 해요.
✅ 안전한 예
// 코드에는 이름만, 진짜 값은 환경 변수에
const apiKey = process.env.API_KEY;
# .gitignore
.env
높음 GitHub 토큰이 코드에 있어요
왜 문제인가요? GitHub 토큰은 내 계정 대신 저장소를 읽고 고칠 수 있는 열쇠예요. 새어 나가면 남이 내 코드를 지우거나 바꿀 수 있어요.
고치는 법: ① 코드에서 바로 지워요. ② 이미 저장소(GitHub 등)에 올렸거나 남에게 보냈다면 새어 나갔다고 생각하고, 그 서비스에서 열쇠를 새로 발급(바꾸기)하고 옛 열쇠는 없애요. ③ 앞으로는 환경 변수나 .env 파일에 두고, .gitignore에 .env를 적어 올라가지 않게 해요.
✅ 안전한 예
// 코드에는 이름만, 진짜 값은 환경 변수에
const apiKey = process.env.API_KEY;
# .gitignore
.env
중간 Google API 키가 코드에 있어요
왜 문제인가요? Google API 키로 지도·번역 같은 유료 기능을 남이 내 이름으로 쓸 수 있어요. Firebase 웹 설정처럼 원래 공개되는 키도 있지만, 그때도 "어느 사이트에서만 쓸 수 있는지" 제한을 꼭 걸어야 해요.
고치는 법: ① 코드에서 바로 지워요. ② 이미 저장소(GitHub 등)에 올렸거나 남에게 보냈다면 새어 나갔다고 생각하고, 그 서비스에서 열쇠를 새로 발급(바꾸기)하고 옛 열쇠는 없애요. ③ 앞으로는 환경 변수나 .env 파일에 두고, .gitignore에 .env를 적어 올라가지 않게 해요. 공개용 키라면 Google Cloud 콘솔에서 사용할 수 있는 주소·앱을 제한해요.
✅ 안전한 예
// 코드에는 이름만, 진짜 값은 환경 변수에
const apiKey = process.env.API_KEY;
# .gitignore
.env
높음 결제(Stripe) 비밀 키가 코드에 있어요
왜 문제인가요? Stripe 비밀 키(sk_live)는 진짜 돈이 오가는 결제 계정의 열쇠예요. 새어 나가면 환불·결제 정보가 위험해요.
고치는 법: ① 코드에서 바로 지워요. ② 이미 저장소(GitHub 등)에 올렸거나 남에게 보냈다면 새어 나갔다고 생각하고, 그 서비스에서 열쇠를 새로 발급(바꾸기)하고 옛 열쇠는 없애요. ③ 앞으로는 환경 변수나 .env 파일에 두고, .gitignore에 .env를 적어 올라가지 않게 해요.
✅ 안전한 예
// 코드에는 이름만, 진짜 값은 환경 변수에
const apiKey = process.env.API_KEY;
# .gitignore
.env
낮음 결제(Stripe) 시험용 키가 코드에 있어요
왜 문제인가요? 시험용 키라서 진짜 돈은 안 움직이지만, 비밀 키를 코드에 넣는 습관이 들면 언젠가 진짜 키도 같이 올라가요.
고치는 법: ① 코드에서 바로 지워요. ② 이미 저장소(GitHub 등)에 올렸거나 남에게 보냈다면 새어 나갔다고 생각하고, 그 서비스에서 열쇠를 새로 발급(바꾸기)하고 옛 열쇠는 없애요. ③ 앞으로는 환경 변수나 .env 파일에 두고, .gitignore에 .env를 적어 올라가지 않게 해요.
✅ 안전한 예
// 코드에는 이름만, 진짜 값은 환경 변수에
const apiKey = process.env.API_KEY;
# .gitignore
.env
높음 Slack 토큰이 코드에 있어요
왜 문제인가요? Slack 토큰으로 남이 내 대화방의 메시지를 읽거나 보낼 수 있어요.
고치는 법: ① 코드에서 바로 지워요. ② 이미 저장소(GitHub 등)에 올렸거나 남에게 보냈다면 새어 나갔다고 생각하고, 그 서비스에서 열쇠를 새로 발급(바꾸기)하고 옛 열쇠는 없애요. ③ 앞으로는 환경 변수나 .env 파일에 두고, .gitignore에 .env를 적어 올라가지 않게 해요.
✅ 안전한 예
// 코드에는 이름만, 진짜 값은 환경 변수에
const apiKey = process.env.API_KEY;
# .gitignore
.env
높음 개인 키(Private Key)가 들어 있어요
왜 문제인가요? 개인 키는 서버 접속이나 암호를 푸는 데 쓰는 아주 중요한 열쇠예요. 이 파일이 공개되면 내 서버나 인증서를 남이 쓸 수 있어요.
고치는 법: ① 코드에서 바로 지워요. ② 이미 저장소(GitHub 등)에 올렸거나 남에게 보냈다면 새어 나갔다고 생각하고, 그 서비스에서 열쇠를 새로 발급(바꾸기)하고 옛 열쇠는 없애요. ③ 앞으로는 환경 변수나 .env 파일에 두고, .gitignore에 .env를 적어 올라가지 않게 해요. 키 파일은 프로젝트 폴더 밖에 두는 게 가장 좋아요.
✅ 안전한 예
# .gitignore
*.pem
*.key
id_rsa*
중간 로그인 토큰(JWT)이 코드에 있어요
왜 문제인가요? JWT는 "이 사람은 로그인했어요"라는 출입증이에요. 코드에 남은 토큰이 아직 쓸 수 있는 것이면 남이 그 사람인 척할 수 있어요.
고치는 법: 시험하려고 넣은 토큰이라면 지워요. 필요하면 시험할 때마다 새로 만들어 쓰고, 진짜 토큰은 서버에서 짧은 시간만 쓰게 해요.
✅ 안전한 예
// 시험용 토큰은 그때그때 만들기
const token = await makeTestToken({ expiresIn: '5m' });
중간 비밀번호·토큰 같은 값이 코드에 그대로 있어요
왜 문제인가요? 이름이 password·secret·token·key 인 곳에 진짜처럼 보이는 값이 들어 있어요. 코드를 공유하는 순간 이 값도 같이 퍼져요.
고치는 법: ① 코드에서 바로 지워요. ② 이미 저장소(GitHub 등)에 올렸거나 남에게 보냈다면 새어 나갔다고 생각하고, 그 서비스에서 열쇠를 새로 발급(바꾸기)하고 옛 열쇠는 없애요. ③ 앞으로는 환경 변수나 .env 파일에 두고, .gitignore에 .env를 적어 올라가지 않게 해요.
✅ 안전한 예
// 코드에는 이름만, 진짜 값은 환경 변수에
const apiKey = process.env.API_KEY;
# .gitignore
.env
높음 .env 파일 속 비밀 값
왜 문제인가요? .env 파일은 비밀 값을 모아 두는 곳이라 절대 올리거나 공유하면 안 돼요. 지금 검사한 파일들 안에 같이 들어 있어요.
고치는 법: .env 파일은 공유하지 말고, .gitignore에 꼭 적어요. 이미 올렸다면 안에 있던 열쇠를 모두 새로 발급해요. 다른 사람에게는 값이 빈 .env.example 파일만 보여 줘요.
✅ 안전한 예
# .env.example (값은 비워서 공유)
API_KEY=
DB_PASSWORD=
중간 .env 파일이 같이 들어 있어요
왜 문제인가요? .env 파일은 보통 비밀 값을 담아요. 코드와 같이 올리거나 압축해서 보내면 비밀이 새어 나가요.
고치는 법: .gitignore에 .env를 적었는지 확인하고, 다른 사람에게 줄 때는 이 파일을 빼요.
✅ 안전한 예
# .gitignore
.env
.env.*
!.env.example
🛡️ 취약점(약한 곳)
공격받기 쉬운 코드 모양을 찾아요. 이용자가 넣은 값이 HTML·SQL·명령 줄·코드 실행으로 그대로 흘러가는 곳이 가장 위험해요. 같은 규칙이라도 이용자 값처럼 보이는 이름(input, query, user…)이 섞이면 위험도를 높게 표시하고, 글자를 그대로 쓴 안전한 경우(예: innerHTML = "<b>안녕</b>")는 빼요.
높음 eval() 로 글자를 코드로 실행해요
왜 문제인가요? eval은 글자를 그대로 코드로 바꿔 실행해요. 그 글자에 이용자가 넣은 내용이 조금이라도 섞이면, 남이 내 사이트에서 마음대로 코드를 실행할 수 있어요.
고치는 법: 데이터를 읽는 거라면 JSON.parse를, 계산이라면 직접 함수를 만들어 써요. 글자를 코드로 실행하지 않는 방법은 거의 항상 있어요.
✅ 안전한 예
// 데이터라면
const data = JSON.parse(text);
// 정해진 동작 중 고르기라면
const actions = { save, load };
actions[name]?.();
높음 new Function() 으로 글자를 코드로 만들어요
왜 문제인가요? new Function은 eval과 똑같이 글자를 코드로 바꿔요. 바깥에서 온 글자가 섞이면 위험해요.
고치는 법: 글자 대신 미리 만든 함수를 골라 쓰게 바꿔요.
✅ 안전한 예
const ops = { add: (a, b) => a + b, sub: (a, b) => a - b };
const result = ops[op] ? ops[op](a, b) : 0;
중간 setTimeout/setInterval 에 글자를 넣었어요
왜 문제인가요? 타이머에 글자를 넣으면 eval처럼 그 글자를 코드로 실행해요.
고치는 법: 글자 대신 함수를 넘겨요.
✅ 안전한 예
setTimeout(() => showMessage(), 1000);
높음 innerHTML 에 바깥 값을 그대로 넣어요 (XSS 위험)
왜 문제인가요? innerHTML·outerHTML·insertAdjacentHTML 은 넣은 글자를 HTML 로 해석해요. 이용자가 쓴 글이나 주소 값이 섞이면, 남이 내 화면에 스크립트를 끼워 넣을 수 있어요(XSS).
고치는 법: 글자만 보여 줄 때는 textContent를 써요. HTML이 꼭 필요하면 document.createElement로 만들거나, 믿을 수 있는 정리 도구(예: DOMPurify)를 거쳐요.
✅ 안전한 예
el.textContent = userText;
// 모양이 필요하면 요소를 직접 만들기
const b = document.createElement('b');
b.textContent = userName;
el.append(b);
중간 document.write 에 바깥 값을 넣어요
왜 문제인가요? document.write 도 글자를 HTML로 해석해서 XSS 위험이 있고, 페이지를 느리게 만들어요.
고치는 법: 요소를 만들어 붙이고, 글자는 textContent 로 넣어요.
✅ 안전한 예
const p = document.createElement('p');
p.textContent = message;
document.body.append(p);
중간 dangerouslySetInnerHTML 에 바깥 값을 넣어요
왜 문제인가요? 이름처럼 "위험하게" HTML을 넣는 방법이에요. 이용자 글이 섞이면 XSS 위험이 있어요.
고치는 법: 그냥 {text}로 보여 주면 React가 알아서 안전하게 바꿔 줘요. HTML이 꼭 필요하면 정리 도구를 거쳐요.
✅ 안전한 예
<p>{comment.text}</p>
높음 SQL 문장을 글자 붙이기로 만들어요 (SQL 인젝션 위험)
왜 문제인가요? SQL 문장에 이용자 값을 + 나 ${} 로 바로 붙이면, 값에 SQL 기호가 섞였을 때 데이터베이스가 엉뚱한 명령으로 알아들어요. 다른 사람 정보가 보이거나 지워질 수 있어요.
고치는 법: 값은 자리 표시(?, $1, %s)로 따로 넘겨요. 데이터베이스 도구가 값을 안전하게 처리해 줘요.
✅ 안전한 예
// 자바스크립트
db.query('SELECT * FROM users WHERE id = ?', [id]);
# 파이썬
cur.execute("SELECT * FROM users WHERE id = %s", (user_id,))
높음 명령 줄(exec)에 바깥 값을 붙여요
왜 문제인가요? exec 는 글자를 컴퓨터 명령으로 실행해요. 이용자 값이 섞이면 원하지 않은 명령까지 실행될 수 있어요.
고치는 법: exec 대신 execFile/spawn에 프로그램 이름과 값을 따로 넘겨요. 값은 정해진 목록에 있는지 먼저 확인해요.
✅ 안전한 예
import { execFile } from 'node:child_process';
execFile('ls', ['-l', folder], (err, out) => { /* ... */ });
중간 Math.random 으로 비밀 값을 만들어요
왜 문제인가요? Math.random 은 게임·장식용 난수예요. 다음 값을 짐작할 수 있어서 토큰·비밀번호·인증 번호에 쓰면 안 돼요.
고치는 법: 브라우저·Node 의 crypto를 써요. 파이썬은 secrets 모듈을 써요.
✅ 안전한 예
const token = crypto.randomUUID();
const n = crypto.getRandomValues(new Uint32Array(1))[0];
# 파이썬
import secrets
token = secrets.token_urlsafe(32)
낮음 https 가 아닌 http:// 주소를 써요
왜 문제인가요? http 는 오가는 내용이 잠기지 않아서, 같은 와이파이에 있는 사람이 내용을 엿보거나 바꿀 수 있어요. https 페이지에서는 브라우저가 막기도 해요.
고치는 법: 주소를 https://로 바꿔요. 그 사이트가 https를 지원하는지 확인해요.
✅ 안전한 예
<img src="https://cdn.example/logo.png" alt="로고">
낮음 target="_blank" 링크에 rel="noopener" 가 없어요
왜 문제인가요? 새 창으로 연 페이지가 원래 페이지를 몰래 다른 주소로 바꿀 수 있었어요(옛 브라우저). 요즘 브라우저는 대부분 막지만, 적어 두는 게 안전해요.
고치는 법: rel="noopener noreferrer"를 같이 적어요.
✅ 안전한 예
<a href="https://leapinity.com" target="_blank" rel="noopener noreferrer">Leapinity</a>
낮음 보안 규칙(CSP)이 안 보여요
왜 문제인가요? CSP(콘텐츠 보안 정책)는 "이 페이지는 우리 주소의 스크립트만 실행해요" 같은 규칙이에요. 있으면 XSS 실수가 있어도 피해를 크게 줄여 줘요. (서버 설정으로 이미 보내고 있다면 괜찮아요.)
고치는 법: 서버 응답 헤더나 <meta http-equiv="Content-Security-Policy">로 CSP를 넣어요.
✅ 안전한 예
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'; object-src 'none'">
중간 https 인증서 확인을 껐어요
왜 문제인가요? 인증서 확인을 끄면 가짜 서버와 이야기해도 알 수 없어요. 중간에서 엿보거나 바꾸기 쉬워져요.
고치는 법: 확인을 다시 켜요. 회사 인증서 때문이라면 그 인증서를 믿을 목록에 넣는 방법을 써요.
✅ 안전한 예
// Node
https.request(url, { /* rejectUnauthorized 기본값(true) 그대로 */ });
# 파이썬
requests.get(url) # verify=True 가 기본
높음 파이썬 eval/exec 로 글자를 실행해요
왜 문제인가요? eval·exec 는 글자를 파이썬 코드로 실행해요. 이용자 입력이 섞이면 컴퓨터에서 무엇이든 실행될 수 있어요.
고치는 법: 숫자·목록 같은 값을 읽는 거라면 ast.literal_eval이나 json.loads를 써요.
✅ 안전한 예
import ast, json
value = ast.literal_eval(text) # 숫자·글자·목록만 허용
data = json.loads(text)
높음 pickle 로 바깥 데이터를 읽어요
왜 문제인가요? pickle 은 읽는 순간 그 안의 코드를 실행할 수 있어요. 남이 준 파일이나 인터넷에서 받은 데이터를 pickle 로 읽으면 위험해요.
고치는 법: 주고받는 데이터는 json으로 바꿔요. pickle은 내가 직접 만든 파일에만 써요.
✅ 안전한 예
import json
data = json.loads(received_text)
높음 파이썬에서 셸 명령에 값을 섞어요
왜 문제인가요? shell=True 나 os.system 은 글자 전체를 셸이 해석해요. 값이 섞이면 원하지 않은 명령이 실행될 수 있어요.
고치는 법: shell=True 를 빼고 명령을 목록으로 넘겨요.
✅ 안전한 예
import subprocess
subprocess.run(["ls", "-l", folder], check=True)
중간 yaml.load 를 안전 모드 없이 써요
왜 문제인가요? 안전 모드 없이 읽으면 YAML 안에 파이썬 객체를 만드는 명령이 들어 있을 때 그대로 실행될 수 있어요.
고치는 법: yaml.safe_load를 써요.
✅ 안전한 예
import yaml
config = yaml.safe_load(text)
높음 loadstring 으로 글자를 실행해요
왜 문제인가요? loadstring 은 글자를 Lua 코드로 실행해요. 특히 Roblox 서버에서 쓰면 플레이어가 보낸 글자가 서버 코드가 될 수 있어요.
고치는 법: 정해진 동작 표를 만들어 이름으로 골라 실행해요.
✅ 안전한 예
local actions = { jump = doJump, dance = doDance }
local fn = actions[name]
if fn then fn() end
중간 RemoteEvent 에서 플레이어가 보낸 값을 그대로 믿어요
왜 문제인가요? 플레이어 쪽(클라이언트) 값은 바꿀 수 있다고 생각해야 해요. 돈·체력·아이템 수를 클라이언트가 보낸 숫자로 바로 정하면 값을 마음대로 바꾸는 사람이 생겨요.
고치는 법: 서버에서 값의 종류·범위를 꼭 확인하고, 가격·보상은 서버가 직접 정해요.
✅ 안전한 예
BuyEvent.OnServerEvent:Connect(function(player, itemId)
local item = Items[itemId] -- 서버의 표에서 찾기
if typeof(itemId) ~= "string" or not item then return end
local coins = player.leaderstats.Coins
if coins.Value < item.price then return end -- 가격은 서버가 정함
coins.Value -= item.price
end)
🐛 흔한 실수
당장 위험하진 않지만 버그를 부르기 쉬운 습관을 찾아요. 고치면 코드를 읽고 고치기가 훨씬 쉬워져요.
낮음 == 대신 === 를 쓰면 더 안전해요
왜 문제인가요? == 는 비교하기 전에 종류를 몰래 바꿔요. 그래서 0 == "", "1" == 1 이 참이 되는 것처럼 생각과 다른 결과가 나와요.
고치는 법: ===, !==를 써요. (x == null처럼 일부러 쓴 곳은 빼고 보여 줘요.)
✅ 안전한 예
if (count === 0) { /* ... */ }
낮음 console.log 가 남아 있어요
왜 문제인가요? 고치면서 넣은 console.log 가 남으면 화면 뒤에 정보가 보이고, 가끔 개인 정보가 찍히기도 해요.
고치는 법: 다 쓴 것은 지우고, 꼭 필요한 기록은 따로 정한 함수로 모아요.
✅ 안전한 예
const DEBUG = false;
function log(...a) { if (DEBUG) console.log(...a); }
중간 오류를 잡고 아무것도 안 해요
왜 문제인가요? catch 나 except 가 비어 있으면 오류가 나도 아무도 몰라요. 나중에 이상한 일이 생겨도 원인을 찾기 어려워요.
고치는 법: 오류를 기록하거나, 이용자에게 알려 주거나, 일부러 무시하는 거라면 이유를 주석으로 적어요.
✅ 안전한 예
try {
save();
} catch (err) {
console.error('저장 실패', err);
showToast('저장하지 못했어요');
}
낮음 TODO·FIXME 메모가 남아 있어요
왜 문제인가요? "나중에 할 일" 메모예요. 잊어버린 채로 배포하면 덜 만든 기능이나 알려진 버그가 그대로 남아요.
고치는 법: 할 일 목록(이슈)으로 옮기거나 끝내고 지워요.
✅ 안전한 예
// (할 일은 이슈 목록에 적고 코드에서는 지우기)
낮음 함수가 너무 길어요
왜 문제인가요? 한 함수가 너무 길면 무엇을 하는지 한눈에 안 보이고, 고칠 때 실수하기 쉬워요.
고치는 법: 하는 일마다 작은 함수로 나누고 이름을 잘 붙여요.
✅ 안전한 예
function startGame() {
setupBoard();
placePlayers();
startTimer();
}
낮음 파일이 너무 길어요
왜 문제인가요? 파일 하나에 너무 많은 코드가 있으면 찾기도 고치기도 어려워요.
고치는 법: 하는 일에 따라 여러 파일로 나눠요(예: 화면, 계산, 저장).
✅ 안전한 예
// game/board.js · game/timer.js · game/save.js 처럼 나누기
import { setupBoard } from './board.js';
낮음 괄호가 너무 깊게 겹쳐 있어요
왜 문제인가요? if 안에 if 안에 for 안에… 처럼 깊어지면 읽기 어렵고 실수가 숨어요.
고치는 법: 조건이 안 맞으면 먼저 return 해서(빨리 나가기) 깊이를 줄이고, 안쪽은 함수로 빼요.
✅ 안전한 예
function give(user) {
if (!user) return;
if (!user.active) return;
addReward(user);
}
낮음 똑같은 코드 덩어리가 또 있어요
왜 문제인가요? 같은 코드를 복사해 두면, 하나를 고칠 때 다른 곳을 잊어서 버그가 생기기 쉬워요.
고치는 법: 겹치는 부분을 함수 하나로 만들고 두 곳에서 불러 써요.
✅ 안전한 예
function drawCard(card) { /* 같은 코드는 여기 한 번만 */ }
drawCard(a);
drawCard(b);
낮음 var 대신 let/const 를 쓰면 좋아요
왜 문제인가요? var 는 블록({ }) 밖에서도 보이고, 선언 전에 써도 오류가 안 나서 헷갈리는 버그를 만들어요.
고치는 법: 바뀌지 않는 값은 const, 바뀌는 값은 let을 써요.
✅ 안전한 예
const max = 10;
let score = 0;
낮음 아마도 안 쓰는 변수예요
왜 문제인가요? 만들어 놓고 한 번도 안 쓰는 변수는 코드를 읽기 어렵게 하고, 실수로 다른 변수를 쓰고 있다는 신호일 수도 있어요.
고치는 법: 정말 안 쓰면 지워요. (다른 곳에서 글자로 부르는 경우도 있으니 확인 후에!)
✅ 안전한 예
// 안 쓰는 줄은 지우기
낮음 except: 가 모든 오류를 잡아요
왜 문제인가요? 아무 종류나 다 잡으면 Ctrl+C 로 멈추기 같은 것까지 막히고, 진짜 원인을 숨겨요.
고치는 법: 잡을 오류 종류를 적어요.
✅ 안전한 예
try:
value = int(text)
except ValueError:
value = 0
🧹 안 쓰는 것 (아마도)
다른 파일 어디에서도 이름이 안 나오는 파일과 함수를 찾아요. 규칙만으로는 100% 알 수 없어서 "아마도"라고 표시해요. 지우기 전에 꼭 확인해 주세요.
낮음 아마도 아무도 안 부르는 파일이에요
왜 문제인가요? 다른 파일의 import·require·<script src> 어디에서도 이 파일 이름이 안 보여요. 예전에 쓰다 남은 파일일 수 있어요.
고치는 법: 정말 안 쓰는지 확인하고 지우거나 따로 보관해요. 첫 시작 파일이나 설정에서 부르는 파일이면 그대로 둬요.
✅ 안전한 예
// 쓰는 파일이라면 어디서 부르는지 분명하게
import { helper } from './helper.js';
낮음 아마도 아무도 안 부르는 함수예요
왜 문제인가요? 이 함수 이름이 만든 곳 말고는 어디에도 안 나와요. 지워도 되는 코드일 수 있어요.
고치는 법: 정말 안 쓰면 지워요. 바깥(다른 프로젝트, HTML 속성 등)에서 부르면 그대로 둬요.
✅ 안전한 예
// 안 쓰는 함수는 지우면 파일이 짧고 읽기 쉬워져요
📝 파일 설명
파일마다 규칙으로 짧은 소개를 만들어요. 언어와 줄 수, 불러오는 것(import·require·<script src>), 내보내는 것(export), 함수·클래스 목록, 맨 위에 적힌 설명 주석을 보여 주고, 폴더 이름과 내용으로 하는 일(화면, 스타일, 설정 파일, 시험 코드, 서버 API, Roblox 서버 스크립트 등)을 짐작해요.
처음 보는 프로젝트를 이해하거나, 내 프로젝트를 다른 사람에게 설명할 때 지도처럼 쓸 수 있어요.
🏅 점수는 이렇게 정해요
100점에서 시작해서 찾은 것마다 조금씩 빼요. 비밀 정보와 약한 곳은 많이, 흔한 실수와 안 쓰는 것은 조금만 빼요. 한 종류에서 빼는 점수에는 한도가 있어서, 작은 실수가 많다고 점수가 0이 되지는 않아요.
- A 90점 이상 — 아주 좋아요
- B 80점 이상 — 좋아요
- C 65점 이상 — 조금만 고쳐요
- D 50점 이상 — 고칠 곳이 꽤 있어요
- E 50점 아래 — 먼저 고쳐야 할 곳이 있어요
점수는 참고용이에요. 숫자보다 높음으로 표시된 것을 먼저 고치는 게 훨씬 중요해요.
❓ 자주 묻는 질문
내 코드가 서버로 올라가나요?
아니요. 파일은 지금 보고 있는 이 브라우저 안에서만 읽고 검사해요. 사이트 보안 설정(CSP)에 connect-src 'none'을 넣어 두어서, 혹시 실수가 있어도 브라우저가 어떤 주소로도 데이터를 보내지 못하게 막아요. 페이지를 연 다음 인터넷을 끄고 써도 똑같이 동작해요.
어떤 언어를 검사하나요?
자바스크립트·타입스크립트·HTML·CSS·파이썬·Lua(Roblox)는 자세히 검사해요. JSON·마크다운·YAML 같은 다른 파일은 줄 세기와 비밀 정보 검사만 해요.
남의 사이트나 프로그램도 검사할 수 있나요?
이 도구는 내가 만든 코드를 스스로 점검하고 배우기 위한 도구예요. 파일을 직접 넣어야만 검사하고, 인터넷의 다른 사이트에는 접속하지 않아요. 남의 코드를 허락 없이 가져와 약점을 찾는 데 쓰면 안 돼요.
문제가 0개면 안전한 건가요?
아니요. 규칙으로 찾을 수 있는 흔한 문제만 찾아요. 로그인·권한·결제처럼 중요한 부분은 믿을 만한 사람에게 검토(코드 리뷰)를 받는 게 좋아요.
비밀 키를 찾았어요. 지우기만 하면 되나요?
이미 GitHub 같은 곳에 올렸거나 남에게 보냈다면, 지워도 예전 기록에 남아 있어요. 그 서비스에 들어가서 열쇠를 새로 발급(바꾸기)하고 옛 열쇠는 없애야 해요. 앞으로는 환경 변수와 .gitignore를 써요.
"높음·중간·낮음"은 무엇으로 정하나요?
높음은 이용자 값이 섞이면 바로 큰 피해가 날 수 있는 것(비밀 키, eval, SQL 글자 붙이기 등), 중간은 조건에 따라 위험해지는 것, 낮음은 습관을 바꾸면 좋은 것이에요. 같은 규칙이라도 이용자 값처럼 보이는 이름이 섞이면 더 높게 표시해요.
결과를 저장하거나 친구에게 보여 줄 수 있나요?
결과 위의 보고서(.md) 저장이나 JSON 저장을 누르면 이 기기에 파일로 저장돼요. 보고서에도 비밀 값은 가려져 있어요. 저장은 서버를 거치지 않아요.
큰 프로젝트도 되나요?
한 번에 파일 5,000개, 모두 합쳐 60MB, 파일 하나 2MB까지 검사해요. 검사는 화면과 따로 도는 "일꾼(Web Worker)"이 해서 화면이 멈추지 않아요. 아주 큰 폴더라면 src처럼 내가 쓴 코드 폴더만 골라 넣으면 빨라요.
AI가 검사하나요?
아니요. 미리 정한 규칙(글자 모양 찾기)으로만 검사해요. 그래서 빠르고, 코드를 어디에도 보내지 않아도 돼요. 대신 사람처럼 뜻을 이해하지는 못해서 가끔 틀릴 수 있어요.