Next.js App Router에서 API 프록시 레이어를 구축하여 CORS, 보안 문제를 해결

by DD
1개월 전
조회수 86

Next.js App Router 기반 프로젝트에서 CORS 문제환경 변수 관리의 어려움으로 API 프록시 레이어 구축

Next.js API Routes를 활용하여 CORS 해결, 백엔드 URL 보안, 인증 토큰 안전 관리를 구현

httpOnly 쿠키를 사용하여 XSS 공격 방지토큰 관리 효율성을 높임

프록시 레이어 도입으로 클라이언트 코드 단순화 및 OAuth 콜백 흐름 개선

API 프록시 레이어의 핵심 아키텍처

본문에서는 Next.js App Router의 API Routes를 활용하여 API 프록시 레이어를 구축한 과정을 설명한다. 핵심은 catch-all 라우트([...path]/route.ts)를 통해 모든 API 요청을 중앙에서 처리하고, 각 요청에 필요한 로직을 추가하는 것이다.

CORS 문제 해결: 프록시 서버에서 Access-Control-Allow-Origin 설정을 일괄 관리하여 프론트엔드와 백엔드 간의 CORS 설정 간소화

보안 강화: 백엔드 URL을 노출하지 않고, httpOnly 쿠키를 사용하여 XSS 공격(Cross-Site Scripting Attack) 방지

코드 단순화: 클라이언트 코드에서 백엔드 URL 및 토큰 관리를 제거하여 개발 생산성 향상

httpOnly 쿠키를 활용한 토큰 관리

글에서는 httpOnly 쿠키를 사용하여 인증 토큰(Authentication Token)을 안전하게 관리하는 방법을 제시한다. httpOnly 쿠키는 JavaScript에서 접근할 수 없으므로, XSS 공격으로부터 안전하다.

토큰 저장: Google OAuth 인증 후 발급된 JWT 토큰을 httpOnly 쿠키에 저장하여 보안성 확보

토큰 전달: 프록시 레이어에서 쿠키에 저장된 토큰을 꺼내 백엔드 API 호출 시 Authorization 헤더에 추가하여 인증 절차 간소화

OAuth 콜백 흐름: OAuth 인증 과정에서 토큰이 URL에 노출되는 문제를 해결하고, httpOnly 쿠키를 활용하여 보안성을 강화

Next.js API Routes의 활용

Next.js API Routes는 서버리스 함수를 쉽게 만들 수 있도록 지원하며, API 프록시 레이어 구축에 핵심적인 역할을 한다. 특히, catch-all 라우트를 사용하면 모든 API 요청을 하나의 파일에서 처리할 수 있어, 코드 관리의 효율성을 높일 수 있다.

API 라우팅: `/api/[...path]/route.ts` 구조를 통해 동적 라우팅을 구현하고, 모든 API 요청을 프록시 서버로 전달

요청 처리: `proxyRequest` 함수를 통해 요청 메서드, 헤더, 바디 등을 처리하고, 백엔드 API를 호출하여 응답을 반환

코드 재사용: 공통 로직을 `proxyRequest` 함수에 모아두어 코드 중복을 줄이고, 유지보수성을 향상

API 프록시 레이어의 장점과 단점

API 프록시 레이어는 보안, CORS, 토큰 관리 등 다양한 문제를 해결하지만, 몇 가지 단점도 존재한다. 프록시 레이어 도입은 트레이드 오프(Trade-off)를 고려하여 결정해야 한다.

장점: 클라이언트 코드 단순화, 보안 강화, OAuth 콜백 흐름 개선

단점: 추가적인 서버(Proxy Server) 운영 비용 발생, 지연 시간(Latency) 증가 가능성, 구현 복잡도 증가

고려 사항: 프로젝트 규모, 보안 요구 사항, 개발 팀의 역량 등을 고려하여 API 프록시 레이어 도입 여부 결정

Next.js App Router에서 프록시 레이어를 둔 이유