Arcjet을 활용한 Netlify Edge Functions 보안 구현 가이드
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
DevOps
대상자
- 대상자: Netlify Edge Functions와 Arcjet 보안 SDK를 사용하는 개발자
- 난이도: 중급 (JavaScript/TypeScript 기초 및 Netlify CLI 사용 경험 필요)
핵심 요약
- Arcjet 통합: Netlify Edge Functions에 Arcjet SDK를 통해 보안 기능(봇 차단, 레이트 제한, PII 탐지 등)을 간단한 코드로 구현 가능
- 보안 기능 예시:
shield({mode: "LIVE"})
,tokenBucket({refillRate: 10, interval: 60})
등의 Arcjet API 사용 - 배포 및 테스트:
netlify dev
로 로컬 테스트 후netlify deploy --prod
로 배포, DRY_RUN 모드로 규칙 검증
섹션별 세부 요약
1. 소개
- Arcjet은 보안-as-code SDK로, Edge에서 직접 앱 보호 가능
- Netlify Edge Functions은 Deno 런타임을 기반으로, 사용자 근처에서 실행되어 성능 최적화
- 핵심 이점: 성능, 보안, 개발자 경험, 유연성
2. 사전 조건
- 필수 설치: Node.js 18+ / Netlify CLI (
npm install -g netlify-cli
) / Arcjet 계정 - 프로젝트 생성:
netlify init
및netlify.toml
파일 구성
```toml
[build]
publish = "public"
[[edge_functions]]
path = "/api/*"
function = "api-handler"
```
3. 기본 구현
- Arcjet 초기화:
```ts
const aj = arcjet({
key: Deno.env.get("ARCJET_KEY")!,
characteristics: ["ip"],
rules: [shield({mode: "LIVE"}), tokenBucket({refillRate: 10, interval: 60})]
});
```
- 요청 보호:
aj.protect(request)
로 결정 후 403/200 응답 처리
4. 보안 기능
- 봇 차단:
detectBot({allow: []})
으로 봇 요청 차단 - PII 탐지 및 블라인드 처리:
sensitiveInfo({detect: ["EMAIL", "PHONE"], redact: true})
- 이메일 검증:
validateEmail(email)
로 유효성 검사
5. 고급 패턴
- 사용자 기반 레이트 제한:
characteristics: ["userId"]
로 인증 사용자 추적 - 지리 기반 규칙 적용:
```ts
const country = context.geo?.country?.code || "UNKNOWN";
const rules = country === "SUSPICIOUS_REGION"
? [tokenBucket({refillRate: 1, capacity: 5})]
: [tokenBucket({refillRate: 10, capacity: 50})];
```
- 경로별 규칙 적용:
/admin
경로에 강화된 보안 규칙 적용
6. 로컬 테스트 및 배포
- 로컬 테스트:
netlify dev
실행 - 테스트 스크립트:
```js
async function testRateLimit() {
for (let i = 0; i < 15; i++) {
const response = await fetch("http://localhost:8888/api/");
console.log(Request ${i + 1}: ${response.status}
);
}
}
```
- 배포:
netlify deploy --prod
후 Arcjet 대시보드에서 실시간 분석
7. 최적화 및 고려 사항
- DRY_RUN 모드 사용: 규칙 테스트 시
shield({mode: "DRY_RUN"})
- 에러 처리: Arcjet 실패 시 기본적으로 요청 허용 (fails open)
- 환경 변수 검증:
if (!Deno.env.get("ARCJET_KEY"))
로 ARCJET_KEY 누락 시 오류 처리 - 정확한 임포트 URL:
```ts
import arcjet from "https://cdn.jsdelivr.net/npm/@arcjet/deno@latest/mod.ts";
```
결론
- 핵심 팁: DRY_RUN 모드로 규칙 테스트 후 LIVE 모드 전환,
netlify dev
로 로컬 테스트, Arcjet API의shield
,tokenBucket
활용 - 배포 후: Arcjet 대시보드에서 실시간 분석 및 규칙 조정 수행
- 보안 강화: 사용자 ID, API 키, IP 등 의미 있는 식별자로 요청 추적 및 레이트 제한 적용