보안 코딩 가이드라인
프론트엔드
XSS 방지
- •
dangerouslySetInnerHTML사용 금지. 불가피하면 DOMPurify로 sanitize 후 사용 - •사용자 입력을
innerHTML로 직접 삽입하지 않는다 - •URL 파라미터를 그대로 렌더링하지 않는다 — 반드시 이스케이프/검증 후 사용
민감 정보 노출 방지
- •API 키, 시크릿을 클라이언트 번들에 포함하지 않는다
- •
NEXT_PUBLIC_접두사가 붙은 환경변수에 민감 정보를 넣지 않는다 - •서버 전용 값은 Server Component 또는 API Route에서만 접근한다
CSRF 방어
- •상태 변경 API 호출 시 CSRF 토큰을 포함한다
- •
SameSite쿠키 속성을 적절히 설정한다
URL/쿼리 파라미터
- •리다이렉트 URL은 화이트리스트 검증한다 (open redirect 방지)
- •쿼리 파라미터를 DB 쿼리나 파일 경로에 직접 사용하지 않는다
백엔드 (NestJS)
인증/인가
- •모든 보호 대상 엔드포인트에 Guard를 적용한다
- •JWT 검증 로직은 미들웨어/Guard에서 처리한다 (Controller에서 직접 검증 금지)
- •역할 기반 접근 제어가 필요한 엔드포인트에
@Roles()데코레이터를 사용한다
인젝션 방지
- •쿼리 파라미터를 직접 SQL/쿼리에 삽입하지 않는다 — Prisma의 파라미터 바인딩을 사용한다
- •
$queryRaw/$executeRaw사용 시 반드시Prisma.sql태그를 사용한다
입력 검증
- •모든 외부 입력은 DTO +
class-validator로 검증한다 - •DTO 없이
@Body() body: any형태로 원시 입력을 받지 않는다 - •
whitelist: true옵션으로 DTO에 정의되지 않은 필드를 자동 제거한다
CORS
- •origin에 와일드카드
*를 사용하지 않는다 (특히 credentials 사용 시) - •허용 도메인을 명시적으로 나열한다
Rate Limiting
- •인증 관련 엔드포인트(로그인, 비밀번호 재설정)에 rate limiting을 적용한다
에러 응답
- •에러 응답에 스택 트레이스, 내부 경로, DB 스키마 정보를 포함하지 않는다
- •프로덕션에서는 일반화된 에러 메시지만 반환한다
- •상세 에러는 서버 로거에만 기록한다
환경 변수
- •시크릿을 코드에 하드코딩하지 않는다
- •
.env파일은.gitignore에 포함한다
헤더 보안
- •Helmet 미들웨어를 적용한다
공통
- •인증 토큰은
httpOnly쿠키에 저장한다 (localStorage/sessionStorage 지양) - •토큰 만료를 적절히 설정하고 갱신 로직을 구현한다
- •의존성에 알려진 CVE가 없는지 주기적으로 확인한다