기본 보안 의식
모든 엔지니어가 지켜야 할 다섯 가지 비협상 규칙
⏱ 예상 ~5분
01 · 읽기
보안 전문가가 될 필요는 없어요. 하지만 대부분의 보안 사고를 일으키는 실수는 꼭 피해야 해요.
사실 대부분의 보안 사고는 정교한 해킹 때문이 아니에요. 엔지니어가 기본을 잊어서 일어나요. 비밀번호가 소스 코드에 남아 있거나, 사용자 입력을 검증하지 않거나, HTTPS여야 할 곳에 HTTP 엔드포인트가 있거나.
이 다섯 규칙이 사고를 막아줘요. 선택이 아니에요. 다른 사람이 믿고 쓸 수 있는 코드를 쓰기 위한 최소 기준이에요.
02 · 읽기
이 다섯 규칙을 외우세요. 주니어 엔지니어가 저지르는 보안 실수의 대부분을 막아줘요.
핵심 정리
- 시크릿 절대 commit 금지: API 키, 비밀번호, 토큰 → .env + .gitignore
- 사용자 입력 신뢰 금지: 폼이나 URL에서 온 건 사용 전에 sanitize
- 항상 HTTPS 사용: 실제로 중요한 건 HTTP 안 됨. 전송 데이터는 암호화 필요
- 의존성 최신 유지: 정기적으로 npm audit으로 알려진 취약점 검사
- 민감한 데이터 로그 금지: console.log(password)나 프로덕션 로그에 토큰 절대 금지
03 · 읽기
출시 전 검토할 앱을 방금 받았어요. cat과 grep으로 보안 위반을 몇 개나 찾을 수 있는지 보세요.
04 · 터미널 실습
먼저 전체 소스 코드를 읽으세요. 방금 배운 다섯 보안 규칙을 위반하는 걸 찾아보세요.
(이 섹션은 인터랙티브해요 — JavaScript를 켜 주세요.)
05 · 터미널 실습
이제 grep으로 잠재적 보안 위반을 한 번에 찾으세요. 비밀번호, 시크릿, 키처럼 보이는 것 전부요.
(이 섹션은 인터랙티브해요 — JavaScript를 켜 주세요.)
06 · 코드 예제
아래는 수정 버전이에요. 본 것과 비교해 보세요. 모든 보안 위반이 처리됐어요.
app.js — 보안 문제 수정됨
require('dotenv').config();
const express = require('express');
const app = express();
// Secrets from .env, not hardcoded
const API_SECRET = process.env.API_SECRET;
app.post('/login', (req, res) => {
// POST body, not URL query string
const { username, password } = req.body;
console.log('Login attempt:', username);
// No password logged! Compare with hashed version in DB
});
app.listen(process.env.PORT || 3000, () => {
console.log('Server running');
// No secrets logged!
});
수정 사항: (1) 시크릿을 dotenv로 .env에 이동, (2) 로그인은 GET(URL)이 아니라 POST(body)로, (3) username만 로그, 비밀번호는 절대 로그 금지, (4) 하드코딩된 비밀번호 비교 없음. 적절한 인증 시스템과 해시된 비밀번호 사용, (5) 시작 로그가 시크릿을 노출하지 않음.
07 · 퀴즈
다음 중 절대로 git에 commit하면 안 되는 것은?
- package.json
- API 키가 들어 있는 .env 파일
- index.html
- README.md
08 · 빈칸 채우기
프로젝트 의존성의 알려진 취약점을 검사하려면 npm _____을 실행하세요.
⚠ 전체 인터랙티브 경험에는 JavaScript가 필요해요. JavaScript를 켜고 새로 고침해 주세요.
※ 이 사이트는 독립 운영되는 교육 프로젝트로, Anthropic의 공식 제품이 아니에요. Claude™ 는 Anthropic, PBC 의 상표예요.