← 노드 한 장 전체#44 · Guardrails

Guardrails

연락처가 있는 문의만 따로 걸러내기

이 글은 이런 분께입력에 특정 패턴이 있는지 확인해 통과와 차단으로 나누고 싶은 분
Guardrails 영상 표지

1분 영상은 @workflow.hanjang 에 순서대로 공개돼요

JSON 받기

가상 문의 4개, 연락처 형식이 있다면?

노드 한 장 #44 · Guardrails

먼저 결과부터

직접 작성한 가상 문의 4건을 Guardrails의 Custom Regex 두 패턴(이메일 형식·하이픈 있는 010 번호 형식)으로 검사했습니다. 실제 Pass 2건, Fail 2건, Guardrails 노드 12ms였습니다(#74825). 이메일은 [email protected], 가상 번호는 공개 화면에서 010-****-****로 표시하고 caseId로 원문과 연결했어요. 실제 고객 데이터가 아니며 모델 연결과 외부 발송도 없습니다. 다른 연락처 형태나 개인정보는 통과할 수 있으므로 모든 PII 차단을 보장하지 않습니다. 결과 카드는 실제 실행값을 재배치한 것입니다.
우리가 실제로 돌린 기록 · 실행 #74825 · 2026-10-30

따라 하기

실제로 실행한 워크플로우를 바탕으로 정리했어요. 계정·식별자는 공개용 값으로 치환했고, 그 밖의 차이는 아래 주의사항에 표시했어요. n8n 캔버스에서 +를 눌러 노드를 순서대로 추가하고 같은 값을 넣으면 돼요. 빨간 제목이 이번 편의 주인공 노드예요. 표 왼쪽은 n8n 편집기에 보이는 칸 이름, 오른쪽은 다운로드 JSON의 설정값이에요. 직접 입력하기 번거로우면 JSON을 받아 ⋯ → Import from File로 가져오세요.

Step 1. Manual Trigger 노드 추가이름: Run manually

설정 없이 그대로 추가해요.

Step 2. Code 노드 추가이름: Four fictional inquiries

JavaScript
// 직접 작성한 안전한 가상 문의. 실제 사람/연락처 아님.
return [{"caseId":"A","text":"샘플 문의: 머그컵 재입고 일정이 궁금해요.","publicLabel":"재입고 일정 문의","expected":"Pass"},{"caseId":"B","text":"샘플 문의: 답장은 [email protected] 으로 부탁해요.","publicLabel":"[email protected] 포함","expected":"Fail"},{"caseId":"C","text":"샘플 문의: 가상 연락처 010-0000-0000 이 들어 있어요.","publicLabel":"010-****-**** 포함","expected":"Fail"},{"caseId":"D","text":"샘플 문의: 노트의 환불 정책을 알려주세요.","publicLabel":"환불 정책 문의","expected":"Pass"}].map(x=>({json:{sample:true,...x}}));

Step 3. Guardrails 노드 추가이름: Guardrails

OperationCheck Text for Violations
Text To Check{{ $json.text }}
Regex 1 › Namesample_email_format
Regex 1 › Regex/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi
Regex 2 › Namesample_010_phone_format
Regex 2 › Regex/\b010-\d{4}-\d{4}\b/g

Step 4. Code 노드 추가이름: Public Pass results

JavaScript
// Guardrails emits guardrailsInput/checks, not the original fields. Match unique actual input text to sample case, then publish only safe label.
const src=$('Four fictional inquiries').all().map(x=>x.json);return $input.all().map((it,i)=>{const matches=src.filter(s=>s.text===it.json.guardrailsInput);if(matches.length!==1)throw Error('Unique sample mapping required');const s=matches[0];return {json:{sample:true,caseId:s.caseId,publicLabel:s.publicLabel,branch:'Pass',expected:s.expected,matchesExpected:s.expected==='Pass',checkTriggered:it.json.checks.some(c=>c.triggered)},pairedItem:{item:i}};});

Step 5. Code 노드 추가이름: Public Fail results

JavaScript
// Guardrails emits guardrailsInput/checks, not the original fields. Match unique actual input text to sample case, then publish only safe label.
const src=$('Four fictional inquiries').all().map(x=>x.json);return $input.all().map((it,i)=>{const matches=src.filter(s=>s.text===it.json.guardrailsInput);if(matches.length!==1)throw Error('Unique sample mapping required');const s=matches[0];return {json:{sample:true,caseId:s.caseId,publicLabel:s.publicLabel,branch:'Fail',expected:s.expected,matchesExpected:s.expected==='Fail',checkTriggered:it.json.checks.some(c=>c.triggered)},pairedItem:{item:i}};});

가져와서 쓸 때 확인할 것

노드의 모든 옵션은 n8n 공식 문서에서 볼 수 있어요.