Next.js
Next.js 서버 액션은 정말 서버에서 실행되는가?
서버 액션을 썼다면, 실제로 서버에서만 실행되는지 빌드 로그와 응답으로 확인해야 한다.
Next.js 서버 액션은 강력하지만, 잘못 쓰면 민감한 코드가 클라이언트로 노출될 수 있다. "use server" 지시문을 써도 정말로 보안이 유지되는지 점검하는 방법을 정리했다.
먼저 빌드 로그 읽기
Next.js는 빌드할 때 어떤 코드가 서버로만 갈 수 있는지 분석한다.
npm run build
빌드 로그에서 경고가 있는지 확인한다. "Server action uses ..." 같은 경고가 나면, 그 액션이 문제일 수 있다.
클라이언트에 노출되면 안 될 코드 목록
서버 액션 내에서 다음이 있으면 위험하다:
- API 키나 토큰 (DB 암호, 3rd party 서비스 키)
- 민감한 비즈니스 로직
- 데이터베이스 직접 접근 코드
실제 번들에서 확인하기
빌드 후, 클라이언트로 전송되는 JS 파일들을 확인해본다.
node -e "const fs=require('fs'); const code=fs.readFileSync('.next/static/chunks/_app.js','utf8'); if(code.includes('process.env.DATABASE_PASSWORD')) console.log('DANGER: Exposed');"
더 간단하게는, 생성된 번들을 텍스트 에디터에서 열어서 민감한 문자열을 검색해본다.
서버 액션 응답 확인 (DevTools)
Chrome DevTools의 Network 탭에서 서버 액션 호출을 본다.
- 브라우저 DevTools 열기
- Network 탭 선택
- 서버 액션을 트리거하는 버튼 클릭
_next/...같은 POST 요청 클릭- Response 확인: 실제 데이터가 맞는가?
응답이 예상했던 데이터라면, 기본적으로는 안전하다.
재현 조건 고정하기
특정 시나리오에서만 문제가 생긴다면, 그 조건을 정확히 기록해두자.
- 로그인 상태인가 아닌가?
- 특정 사용자 역할인가? (admin, user 등)
- 데이터는 정말 DB에서 가져온 건가, 아니면 하드코딩된 값인가?
프로덕션 빌드로 테스트하기
개발 환경에서는 잘 보이지 않는 문제가 프로덕션에서 나타날 수 있다.
npm run build
npm start
Then 실제 배포 URL에서 같은 동작을 반복해본다.
감시할 포인트
배포 후에도 주기적으로 확인해야 할 것들:
- 서버 액션이 정말 서버에서 실행되는가? (응답 시간이 로컬과 다른가?)
- 에러 메시지가 사용자에게 민감한 정보를 노출하는가?
- 로그에 의도치 않은 정보가 쌓이지 않는가?