์ด ํ๋ก์ ํธ๋ Cursor ์ด๋ณด์ ํ์ต ํ๋ก์ ํธ๋ก์, ์ฒ์๋ถํฐ ๋ณด์์ ์ต์ฐ์ ์ผ๋ก ๊ณ ๋ คํ์ฌ ์ค๊ณ๋์์ต๋๋ค.
- npm audit: ์ ๊ธฐ์ ์ผ๋ก ์ทจ์ฝ์ ๊ฒ์ฌ ์ํ
- ์ ๋ขฐํ ์ ์๋ ํจํค์ง ์ฌ์ฉ: OpenAI SDKใAnthropic SDKใNext.js ์ฌ์ฉ
- ์ต์ ๋ฒ์ ์ ์ง: ๋ณด์ ํจ์น์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์ํ ๋ฐ์
- ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ: API ํค์ ๊ฐ์ ๋ฏผ๊ฐ ์ ๋ณด๋ .env ํ์ผ์์ ๊ด๋ฆฌ
- ํ๋์ฝ๋ฉ ๊ธ์ง: ์์ค ์ฝ๋์ ์ง์ ๊ธฐ๋ฐ ์ ๋ณด ํฌํจ ๊ธ์ง
- ๋ฐ๋ชจ ๋ชจ๋ ์ง์: API ํค ์์ด๋ ์์ ํ๊ฒ ์คํ ๊ฐ๋ฅํ ๋ชจ๋ ์ ๊ณต
// ์๊ฒฉํ ์
๋ ฅ ๊ฒ์ฆ ์์
if (!text || typeof text !== "string" || text.trim() === "") {
return NextResponse.json(
{ success: false, error: "Text is required" },
{ status: 400 }
);
}- CSP (Content Security Policy): XSS(ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ ) ๋ฐฉ์ง
- X-Frame-Options: ํด๋ฆญ์ฌํน(Clickjacking) ๋ฐฉ์ง
- X-Content-Type-Options: MIME ํ์ ์ค๋ํ ๋ฐฉ์ง
- ์์ ํ
(Hook):
rm -rf๋ฑ ์ํ ๋ช ๋ น ์๋ ๊ฐ์ง ๋ฐ ์ฐจ๋จ - gomi ์ฐ๋: ๋ณต๊ตฌ ๊ฐ๋ฅํ ์์ ์ญ์ ๋ฐฉ์ ๊ถ์ฅ
- Claude Code ์์ ์ค์ : AI๊ฐ ์์ฑํ ๋ช ๋ น์ด ์คํ ์ ํ์ธ ์ ์ฐจ ์ ์ฉ
npm audit --audit-level moderate
# ๊ฒฐ๊ณผ: found 0 vulnerabilities โ
- API ํค ํ๋์ฝ๋ฉ: ์์ โ
- ๋น๋ฐ๋ฒํธ/ํ ํฐ ํ๋์ฝ๋ฉ: ์์ โ
- ๊ธฐ๋ฐ ํ์ผ Git ์ ์ธ ์ค์ : ์ ์ โ
- ์ ๋ ฅ ๊ฒ์ฆ: ์ ์ ํ ๊ตฌํ๋จ โ
- ์๋ฌ ์ฒ๋ฆฌ: ์ ์ ํ ๊ตฌํ๋จ โ
- XSS ๋ฐฉ์ง: CSP ํค๋ ์ ์ฉ โ
๋ณด์์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ณด๊ณ ํด ์ฃผ์ธ์:
- GitHub Issues: ์ผ๋ฐ์ ์ธ ๋ณด์ ์ด์
- ์ง์ ์ฐ๋ฝ: ์ฌ๊ฐํ ์ทจ์ฝ์ ์ผ ๊ฒฝ์ฐ ๋ณด์ ๋ด๋น์์๊ฒ ์ง์ ๋ณด๊ณ
-
npm audit๊ฒฐ๊ณผ ์ทจ์ฝ์ 0๊ฑด - ํ๊ฒฝ ๋ณ์์ ๋ชจ๋ ๊ธฐ๋ฐ ์ ๋ณด ์ ์ฅ
- ๋ชจ๋ API ์๋ํฌ์ธํธ์ ์ ๋ ฅ ๊ฒ์ฆ ์ ์ฉ
- ์๋ฌ ๋ฉ์์ง์ ๊ธฐ๋ฐ ์ ๋ณด ํฌํจ ๊ธ์ง
- ์ํ ๋ช ๋ น ์คํ ์ ์์ ํ์ธ
- ์์กด์ฑ ์ ๊ธฐ ์ ๋ฐ์ดํธ
- ๋ณด์ ํค๋(CSP ๋ฑ) ์ ์ ํ ์ค์
- ๋ก๊ทธ์ ๊ธฐ๋ฐ ์ ๋ณด ๊ธฐ๋ก ๊ธ์ง
- ์ต์ ๊ถํ ์์น(Principle of Least Privilege) ์ ์ฉ
์ด ํ๋ก์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ ๋ณด์ ์ ์ง ํ๋์ ์ํํฉ๋๋ค:
- ์๋ํ๋ ๋ณด์ ๊ฒ์ฌ: Git hooks๋ก ์ํ ์์ ์ฐจ๋จ
- ์ ๊ธฐ ์ ๊ฒ: ์์กด์ฑ ๋ฐ ์ฝ๋ ๋ณด์ ์ํ ์ฃผ๊ธฐ์ ํ์ธ
- ๊ต์ก์ ๋ฐฐ๋ ค: ์ด๋ณด์์๊ฒ ์์ ํ ํ์ต ํ๊ฒฝ ์ ๊ณต
์ต์ข ์ ๋ฐ์ดํธ: 2025-08-01 18:55:00 KST