← 전체 글로 돌아가기

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 탭에서 서버 액션 호출을 본다.

  1. 브라우저 DevTools 열기
  2. Network 탭 선택
  3. 서버 액션을 트리거하는 버튼 클릭
  4. _next/... 같은 POST 요청 클릭
  5. Response 확인: 실제 데이터가 맞는가?

응답이 예상했던 데이터라면, 기본적으로는 안전하다.

재현 조건 고정하기

특정 시나리오에서만 문제가 생긴다면, 그 조건을 정확히 기록해두자.

  • 로그인 상태인가 아닌가?
  • 특정 사용자 역할인가? (admin, user 등)
  • 데이터는 정말 DB에서 가져온 건가, 아니면 하드코딩된 값인가?

프로덕션 빌드로 테스트하기

개발 환경에서는 잘 보이지 않는 문제가 프로덕션에서 나타날 수 있다.

npm run build
npm start

Then 실제 배포 URL에서 같은 동작을 반복해본다.

감시할 포인트

배포 후에도 주기적으로 확인해야 할 것들:

  • 서버 액션이 정말 서버에서 실행되는가? (응답 시간이 로컬과 다른가?)
  • 에러 메시지가 사용자에게 민감한 정보를 노출하는가?
  • 로그에 의도치 않은 정보가 쌓이지 않는가?