프론트엔드 보안
프론트엔드 개발 시 놓치기 쉬운 보안 위협은 크게 네 가지 유형으로 나뉜다. XSS, CSRF, 클릭재킹, 민감 데이터 노출이 그것이다. Next.js 환경을 기준으로 각 위협의 원리와 대응법을 이해하면 보안 취약점을 사전에 차단할 수 있다.
XSS(Cross-Site Scripting)는 가장 흔한 공격 유형으로, 입력 필드나 URL 파라미터를 통해 악성 스크립트를 삽입해 다른 사용자의 브라우저에서 실행되도록 만든다. 세 가지로 구분된다. Reflected XSS는 악성 스크립트가 포함된 URL을 사용자가 클릭하면 서버가 해당 스크립트를 응답에 포함해 실행시키는 방식이다. Stored XSS는 게시판·댓글 등에 스크립트를 영구 저장해 다수 사용자를 감염시킬 수 있어 파급력이 가장 크다. DOM based XSS는 서버가 아닌 브라우저의 DOM 조작 과정에서 발생해 서버 로그에 남지 않아 탐지가 어렵다. Next.js(React 기반)는 JSX 렌더링 시 기본적으로 문자열을 Escape 처리하지만, `dangerouslySetInnerHTML`을 사용할 경우 이 기능이 비활성화되므로 `dompurify`(`isomorphic-dompurify`) 라이브러리로 HTML을 반드시 정화해야 한다. 추가로 `next.config.js`의 CSP(Content-Security-Policy) HTTP 헤더를 설정해 브라우저가 로드·실행할 수 있는 리소스를 제한한다. `unsafe-inline`과 `unsafe-eval`은 보안상 취약하므로 꼭 필요한 경우가 아니라면 사용을 피해야 한다.
CSRF(Cross-Site Request Forgery)는 로그인된 사용자가 악성 링크를 클릭하면 의도치 않은 서버 요청(글 삭제, 정보 수정 등)이 전송되도록 만드는 공격이다. `next.config.js`에 `X-Content-Type-Options: nosniff`, `Referrer-Policy: strict-origin-when-cross-origin`, `Set-Cookie: SameSite=Strict` 헤더를 추가해 방어한다.
클릭재킹(Clickjacking)은 투명한 `
민감한 데이터 노출 문제는 환경 변수 관리에서 자주 발생한다. Next.js에서 `NEXT_PUBLIC_` 접두사가 붙은 환경 변수는 번들된 JS 파일에 포함되어 누구나 확인 가능하다. 민감한 키는 서버 전용 환경 변수로만 사용하고, `.env` 파일은 `.gitignore`에 추가해 저장소에 올라가지 않도록 해야 한다. Vercel 등 배포 플랫폼에서는 플랫폼이 제공하는 환경 변수 설정을 통해 프로덕션 키를 관리한다.
핵심 내용
- XSS 3유형: Reflected(URL 파라미터 삽입) / Stored(DB 영구 저장) / DOM based(클라이언트 DOM 조작)
- `dangerouslySetInnerHTML` 사용 시 `dompurify`로 입력값 정화 필수
- CSP 헤더로 브라우저가 로드할 수 있는 리소스 종류·출처 제한
- CSRF 대응: `SameSite=Strict` 쿠키 + Referrer-Policy 헤더 설정
- 클릭재킹 대응: `X-Frame-Options: DENY` 또는 `SAMEORIGIN`
- `NEXT_PUBLIC_` 환경 변수는 번들에 포함되어 외부 노출 → 민감 정보에 사용 금지
- `.env` 파일은 반드시 `.gitignore`에 포함, 프로덕션 키는 배포 플랫폼 환경 변수로 관리
관련 개념
- JWT 인증과 인가 — 토큰 기반 인증 메커니즘과 토큰 탈취 위험 대응
- 웹 인증과 쿠키 — 세션·쿠키 기반 인증과 보안 속성(HttpOnly, Secure)
- Next.js 레이아웃과 템플릿 — Next.js 아키텍처와 서버/클라이언트 컴포넌트 구분
- 웹 아키텍처 — 서버와 클라이언트의 역할 분리와 보안 경계
출처
- Front-End 개발 시 보안 고려사항 — 2025-07-21, hyejun.lee