🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

AWS Guardrails 완벽 가이드 - 슬라이드 1/7
A

AI Generated

2025. 12. 18. · 7 Views

AWS Guardrails 완벽 가이드

AWS Bedrock의 Guardrails 기능을 활용하여 AI 모델의 응답을 안전하게 제어하는 방법을 배웁니다. 민감한 정보 보호부터 부적절한 콘텐츠 차단까지, 실무에서 바로 적용할 수 있는 설정 방법을 다룹니다.


목차

  1. Guardrails란_무엇인가
  2. Guardrails_생성하기
  3. 콘텐츠_필터_설정
  4. PII_감지_및_마스킹
  5. 주제_차단_설정
  6. Guardrails_테스트

1. Guardrails란 무엇인가

AI 챗봇 서비스를 출시한 지 일주일, 김개발 씨는 급하게 호출되었습니다. "고객이 AI에게 이상한 질문을 하니까 민감한 개인정보가 그대로 노출됐어요!" 팀장님의 표정이 심각합니다.

어떻게 해야 할까요?

Guardrails는 한마디로 AI 모델의 응답을 안전하게 통제하는 보안 장치입니다. 마치 놀이터의 안전 펜스처럼, AI가 부적절한 내용을 생성하거나 민감한 정보를 누출하지 않도록 보호합니다.

AWS Bedrock에서 제공하는 이 기능을 사용하면 별도의 복잡한 코딩 없이도 안전한 AI 서비스를 구축할 수 있습니다.

다음 코드를 살펴봅시다.

import boto3

# Bedrock 클라이언트 초기화
bedrock = boto3.client('bedrock')

# Guardrails 정보 확인
response = bedrock.get_guardrail(
    guardrailIdentifier='my-guardrail-id',
    guardrailVersion='1'
)

# Guardrail 상태 출력
print(f"Guardrail 이름: {response['name']}")
print(f"상태: {response['status']}")
# 설정된 정책들을 확인할 수 있습니다
print(f"콘텐츠 필터: {response['contentPolicyConfig']}")

김개발 씨는 최근 회사에서 고객 상담 AI 챗봇 프로젝트를 맡았습니다. Claude 모델을 사용해서 멋진 챗봇을 만들었고, 베타 테스트도 성공적이었습니다.

자신감에 차서 정식 서비스를 오픈했습니다. 그런데 일주일 만에 큰 문제가 터졌습니다.

일부 사용자가 의도적으로 AI를 속여서 다른 고객의 개인정보를 물어보았고, AI가 그대로 답변해 버린 것입니다. 김개발 씨는 식은땀이 났습니다.

박시니어 씨가 사무실로 달려왔습니다. "김개발 씨, AWS Bedrock의 Guardrails 기능을 알고 있나요?

이런 문제를 예방할 수 있는 기능이에요." 그렇다면 Guardrails란 정확히 무엇일까요? 쉽게 비유하자면, Guardrails는 마치 고속도로의 가드레일과 같습니다.

자동차가 도로를 벗어나 위험한 곳으로 가지 못하도록 막아주는 것처럼, AI의 응답이 위험한 영역으로 벗어나지 않도록 보호해 줍니다. 사용자가 어떤 질문을 하든, AI는 안전한 범위 내에서만 답변하게 됩니다.

Guardrails가 없던 시절에는 어땠을까요? 개발자들은 AI 응답을 검증하는 복잡한 로직을 직접 작성해야 했습니다.

욕설 필터링, 개인정보 마스킹, 부적절한 주제 차단 등 모든 것을 코드로 구현했습니다. 문제는 새로운 위협이 나타날 때마다 코드를 수정해야 한다는 점이었습니다.

또한 AI 모델이 생성하는 다양한 패턴의 응답을 모두 예측하기란 불가능에 가까웠습니다. 바로 이런 문제를 해결하기 위해 AWS Guardrails가 등장했습니다.

Guardrails를 사용하면 GUI 콘솔이나 간단한 API 호출만으로 안전 정책을 설정할 수 있습니다. 콘텐츠 필터링, PII 데이터 보호, 주제 제한 등 다양한 보안 기능이 미리 구현되어 있어 바로 활용할 수 있습니다.

무엇보다 AI 모델을 변경하거나 애플리케이션 코드를 수정하지 않아도 보안 정책을 업데이트할 수 있다는 큰 이점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 boto3 라이브러리를 사용해서 Bedrock 클라이언트를 생성합니다. 이 클라이언트가 AWS Bedrock 서비스와 통신하는 핵심 도구입니다.

다음으로 get_guardrail 메서드를 호출하여 특정 Guardrail의 설정 정보를 가져옵니다. guardrailIdentifier는 생성한 Guardrail의 고유 ID이며, guardrailVersion은 버전 번호입니다.

응답 객체에는 Guardrail의 이름, 상태, 그리고 설정된 모든 정책 정보가 담겨 있습니다. 실제 현업에서는 어떻게 활용할까요?

예를 들어 의료 상담 AI 서비스를 개발한다고 가정해봅시다. 환자의 개인 건강 정보는 절대 노출되어서는 안 됩니다.

Guardrails를 설정하면 주민등록번호, 전화번호, 이메일 같은 PII 정보를 자동으로 감지하고 마스킹 처리합니다. 또한 의료 윤리에 어긋나는 주제는 아예 답변하지 않도록 차단할 수 있습니다.

네이버, 카카오 같은 대형 IT 기업들도 이런 패턴을 적극적으로 사용하고 있습니다. 하지만 주의할 점도 있습니다.

초보 개발자들이 흔히 하는 실수 중 하나는 Guardrails를 설정만 해두고 실제로 적용하는 것을 잊는 경우입니다. Guardrail을 생성했다고 해서 자동으로 모든 API 호출에 적용되는 것이 아닙니다.

반드시 API 호출 시 guardrailIdentifier와 guardrailVersion 파라미터를 명시해야 합니다. 그렇지 않으면 설정한 보안 정책이 전혀 작동하지 않습니다.

다시 김개발 씨의 이야기로 돌아가 봅시다. 박시니어 씨의 설명을 들은 김개발 씨는 고개를 끄덕였습니다.

"아, 그래서 대기업 AI 서비스들은 이렇게 안전하게 운영되는 거군요!" Guardrails를 제대로 이해하면 사용자 안전과 개인정보 보호를 보장하는 신뢰할 수 있는 AI 서비스를 만들 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.

실전 팁

💡 - Guardrail은 여러 버전을 관리할 수 있으므로, 테스트용과 프로덕션용을 분리해서 운영하세요

  • Guardrail 정책 변경 후에는 반드시 테스트 케이스로 검증한 뒤 배포하세요
  • CloudWatch 로그를 활성화하면 Guardrail이 차단한 요청을 모니터링할 수 있습니다

2. Guardrails 생성하기

김개발 씨는 이제 직접 Guardrail을 만들어보기로 했습니다. AWS 콘솔에 접속했지만 설정 항목이 너무 많아 어디서부터 시작해야 할지 막막합니다.

"일단 기본적인 것부터 만들어볼까?"

Guardrail 생성은 AWS Bedrock 콘솔이나 API를 통해 안전 정책의 기본 틀을 만드는 과정입니다. 마치 새 프로젝트를 시작할 때 기본 설정 파일을 만드는 것처럼, Guardrail의 이름, 설명, 기본 정책을 정의합니다.

한 번 생성한 Guardrail은 여러 AI 모델과 애플리케이션에서 재사용할 수 있어 효율적입니다.

다음 코드를 살펴봅시다.

import boto3

bedrock = boto3.client('bedrock')

# Guardrail 생성
response = bedrock.create_guardrail(
    name='customer-service-guardrail',
    description='고객 상담 AI를 위한 안전 정책',
    # 콘텐츠 필터 설정
    contentPolicyConfig={
        'filtersConfig': [
            {'type': 'HATE', 'inputStrength': 'HIGH', 'outputStrength': 'HIGH'},
            {'type': 'VIOLENCE', 'inputStrength': 'HIGH', 'outputStrength': 'HIGH'}
        ]
    },
    # 차단 메시지 설정
    blockedInputMessaging='죄송합니다. 해당 질문은 처리할 수 없습니다.',
    blockedOutputsMessaging='안전한 답변을 생성할 수 없습니다.'
)

print(f"Guardrail ID: {response['guardrailId']}")
print(f"버전: {response['version']}")

김개발 씨는 본격적으로 Guardrail을 만들기 시작했습니다. 처음에는 AWS 콘솔의 수많은 옵션들이 복잡해 보였지만, 박시니어 씨가 옆에서 하나씩 설명해주었습니다.

"일단 Guardrail에는 이름이 필요해요. 나중에 여러 개를 만들 텐데, 용도를 알 수 있게 명확한 이름을 붙이는 게 좋습니다." 김개발 씨는 고객 상담용 AI에 사용할 거라서 'customer-service-guardrail'이라고 이름을 지었습니다.

설명란에는 "고객 상담 AI를 위한 안전 정책"이라고 적었습니다. Guardrail 생성 과정을 이해하기 위해 비유를 들어보겠습니다.

마치 아파트 경비실을 설치하는 것과 같습니다. 경비실을 만들 때는 먼저 위치를 정하고, 어떤 사람을 통과시키고 막을지 기본 규칙을 정합니다.

"밤 10시 이후 외부인 출입 금지", "택배는 1층에서만 수령" 같은 규칙이죠. Guardrail도 마찬가지로 기본적인 틀과 규칙을 먼저 만드는 것입니다.

Guardrail 없이 직접 모든 것을 구현한다면 어떨까요? 개발자는 모든 사용자 입력을 검사하는 코드를 작성해야 합니다.

욕설인지, 폭력적인 내용인지, 성적인 내용인지 하나하나 판단하는 로직을 만들어야 합니다. AI가 생성한 응답도 마찬가지로 검사해야 합니다.

이런 코드는 수백 줄에 달하고, 유지보수도 어렵습니다. 새로운 위협이 나타나면 또 코드를 수정해야 합니다.

바로 이런 번거로움을 해결하기 위해 create_guardrail API가 있습니다. 한 번의 API 호출로 기본적인 안전 정책을 갖춘 Guardrail을 생성할 수 있습니다.

콘텐츠 필터 설정을 통해 혐오, 폭력, 성적 콘텐츠 등을 차단할 수 있습니다. 각 카테고리별로 입력과 출력에 대한 차단 강도를 LOW, MEDIUM, HIGH 중에서 선택할 수 있습니다.

무엇보다 코드 몇 줄이면 기업급 보안 정책을 구축할 수 있다는 점이 큰 장점입니다. 코드를 자세히 살펴보겠습니다.

먼저 name과 description 파라미터로 Guardrail의 정체성을 정의합니다. contentPolicyConfig는 콘텐츠 필터링 정책을 담고 있는데, filtersConfig 배열에 여러 필터를 추가할 수 있습니다.

HATE 타입은 혐오 발언을, VIOLENCE는 폭력적 콘텐츠를 차단합니다. inputStrength는 사용자 입력에 대한 차단 강도이고, outputStrength는 AI 응답에 대한 차단 강도입니다.

blockedInputMessaging과 blockedOutputsMessaging은 차단되었을 때 사용자에게 보여줄 메시지입니다. 응답으로 받는 guardrailId는 이후 API 호출에서 사용할 고유 식별자이며, version은 현재 버전 번호입니다.

실무에서는 어떻게 활용할까요? 예를 들어 온라인 교육 플랫폼을 운영한다고 가정해봅시다.

학생들이 AI 튜터에게 질문을 하는데, 부적절한 내용이 섞여서는 안 됩니다. Guardrail을 생성할 때 SEXUAL, VIOLENCE, HATE 필터를 모두 HIGH로 설정하면 학생들에게 안전한 학습 환경을 제공할 수 있습니다.

실제로 많은 에듀테크 기업들이 이런 방식으로 안전한 AI 학습 도구를 운영하고 있습니다. 하지만 주의할 점이 있습니다.

초보 개발자들이 자주 하는 실수는 모든 필터를 너무 강하게 설정하는 것입니다. 예를 들어 의학 정보 AI에서 VIOLENCE 필터를 HIGH로 설정하면 "수술", "절개" 같은 정상적인 의료 용어까지 차단될 수 있습니다.

따라서 서비스의 특성에 맞게 적절한 강도를 선택해야 합니다. 처음에는 MEDIUM으로 시작해서 테스트를 거친 뒤 조정하는 것이 좋습니다.

김개발 씨는 첫 번째 Guardrail을 성공적으로 생성했습니다. 콘솔에 출력된 guardrailId를 메모장에 저장하면서 뿌듯함을 느꼈습니다.

"생각보다 어렵지 않네요!" Guardrail 생성은 안전한 AI 서비스의 첫 걸음입니다. 여러분도 직접 만들어보면서 각 옵션의 효과를 확인해 보세요.

실전 팁

💡 - Guardrail 이름은 환경별로 구분하세요 (예: prod-guardrail, dev-guardrail)

  • 생성 후 받은 guardrailId는 반드시 안전하게 저장하고 환경 변수로 관리하세요
  • 태그를 활용하면 여러 Guardrail을 팀이나 프로젝트별로 구분할 수 있습니다

3. 콘텐츠 필터 설정

Guardrail을 만들긴 했는데, 김개발 씨는 궁금했습니다. "필터 강도를 HIGH로 설정하면 정확히 어떤 내용이 차단되는 거지?" 테스트 삼아 몇 가지 질문을 입력해봤더니 예상치 못한 내용까지 차단되는 경우가 있었습니다.

콘텐츠 필터는 AI의 입력과 출력에서 부적절한 내용을 감지하고 차단하는 핵심 기능입니다. 혐오(HATE), 폭력(VIOLENCE), 성적 콘텐츠(SEXUAL), 모욕(INSULTS), 그리고 프롬프트 공격(MISCONDUCT) 등 다섯 가지 카테고리로 나뉩니다.

각 카테고리별로 LOW, MEDIUM, HIGH 세 단계의 민감도를 설정할 수 있어, 서비스 특성에 맞춘 세밀한 조정이 가능합니다.

다음 코드를 살펴봅시다.

import boto3

bedrock = boto3.client('bedrock')

# 콘텐츠 필터가 포함된 Guardrail 업데이트
response = bedrock.update_guardrail(
    guardrailIdentifier='your-guardrail-id',
    contentPolicyConfig={
        'filtersConfig': [
            # 혐오 발언 차단 - 높은 수준
            {'type': 'HATE', 'inputStrength': 'HIGH', 'outputStrength': 'HIGH'},
            # 폭력적 콘텐츠 - 중간 수준
            {'type': 'VIOLENCE', 'inputStrength': 'MEDIUM', 'outputStrength': 'HIGH'},
            # 성적 콘텐츠 - 높은 수준
            {'type': 'SEXUAL', 'inputStrength': 'HIGH', 'outputStrength': 'HIGH'},
            # 모욕적 표현 - 중간 수준
            {'type': 'INSULTS', 'inputStrength': 'MEDIUM', 'outputStrength': 'MEDIUM'},
            # 프롬프트 공격 시도 차단
            {'type': 'MISCONDUCT', 'inputStrength': 'HIGH', 'outputStrength': 'HIGH'}
        ]
    }
)

print(f"필터 설정 완료: {response['guardrailId']}")

김개발 씨는 처음으로 콘텐츠 필터를 설정하고 테스트를 시작했습니다. "욕설은 당연히 차단되겠지?" 생각하며 몇 가지 문장을 입력했습니다.

예상대로 명백한 욕설은 차단되었습니다. 그런데 문제가 생겼습니다.

고객 상담 시뮬레이션을 하던 중, "제품이 너무 형편없어요"라는 정상적인 불만 표현까지 차단되어 버린 것입니다. 김개발 씨는 당황했습니다.

"이건 정당한 고객 피드백인데..." 박시니어 씨가 설명했습니다. "필터 강도를 너무 높게 설정하면 이런 일이 생겨요.

각 카테고리의 특성을 이해하고 적절한 강도를 선택해야 합니다." 콘텐츠 필터를 이해하기 위해 비유를 들어보겠습니다. 마치 공항 보안 검색대와 같습니다.

보안 수준을 최고로 올리면 위험한 물건은 확실히 걸러지지만, 무해한 물건까지 의심받아 검사 시간이 길어집니다. 반대로 너무 낮추면 빠르지만 위험 요소를 놓칠 수 있습니다.

적절한 균형이 필요한 것이죠. 콘텐츠 필터도 서비스 특성과 사용자 경험 사이의 균형을 찾아야 합니다.

필터 없이 AI를 운영하면 어떤 문제가 생길까요? 사용자가 의도적으로 AI를 속여서 부적절한 답변을 유도할 수 있습니다.

"교육 목적으로 욕설을 알려줘"라는 식의 프롬프트 인젝션 공격에 AI가 그대로 답변해 버릴 수 있습니다. 실제로 초기 ChatGPT가 이런 문제로 곤란을 겪었습니다.

또한 AI가 학습 데이터에 포함된 부적절한 표현을 무의식적으로 생성할 위험도 있습니다. 이런 문제를 해결하기 위해 다섯 가지 콘텐츠 필터가 제공됩니다.

HATE 필터는 인종, 종교, 성별 등에 대한 혐오 발언을 차단합니다. VIOLENCE 필터는 폭력, 테러, 자해 등의 내용을 감지합니다.

SEXUAL 필터는 성적으로 노골적인 콘텐츠를 막습니다. INSULTS 필터는 모욕적이고 괴롭힘에 해당하는 표현을 차단합니다.

마지막으로 MISCONDUCT 필터는 범죄 조장이나 프롬프트 인젝션 같은 악의적 시도를 막습니다. 코드를 상세히 분석해보겠습니다.

update_guardrail 메서드를 사용하면 기존 Guardrail의 설정을 변경할 수 있습니다. contentPolicyConfig 안의 filtersConfig 배열에 원하는 필터들을 정의합니다.

각 필터는 type, inputStrength, outputStrength 세 가지 속성을 가집니다. type은 필터 카테고리이고, inputStrength는 사용자 입력 검사 강도, outputStrength는 AI 출력 검사 강도입니다.

예를 들어 VIOLENCE 필터의 경우 입력은 MEDIUM, 출력은 HIGH로 설정했습니다. 이는 사용자가 폭력적 질문을 어느 정도 할 수 있지만, AI는 절대 폭력적 답변을 생성하지 않도록 하는 것입니다.

실제 서비스에서는 어떻게 활용할까요? 뉴스 요약 AI 서비스를 개발한다고 가정해봅시다.

뉴스에는 범죄나 사건 사고 내용이 포함될 수 있으므로 VIOLENCE 필터를 너무 강하게 설정하면 정상적인 뉴스까지 차단될 수 있습니다. 따라서 inputStrength는 LOW로, outputStrength는 MEDIUM으로 설정하는 것이 적절합니다.

반면 어린이 교육용 AI라면 모든 필터를 HIGH로 설정해야 합니다. 주의해야 할 중요한 포인트가 있습니다.

많은 개발자가 모든 필터를 무조건 HIGH로 설정하는 실수를 합니다. 의료 상담 AI에서 "절개", "출혈" 같은 용어가 VIOLENCE로 오인될 수 있고, 심리 상담 AI에서 "우울", "자살" 같은 중요한 키워드가 차단될 수 있습니다.

따라서 반드시 실제 사용 사례를 기반으로 테스트하고 조정해야 합니다. 처음에는 보수적으로 시작해서 점진적으로 강도를 높이는 것이 좋습니다.

또 하나 알아둘 점은 입력과 출력을 다르게 설정할 수 있다는 것입니다. 사용자가 민감한 질문을 하는 것은 어느 정도 허용하되, AI의 답변은 더 엄격하게 관리하는 전략이 효과적입니다.

예를 들어 법률 상담 AI는 "범죄를 어떻게 저지르나요?"라는 질문을 받을 수 있지만, 답변은 법적 처벌과 윤리를 강조하는 방향이어야 합니다. 김개발 씨는 여러 번의 테스트를 거쳐 적절한 필터 강도를 찾았습니다.

HATE와 SEXUAL은 HIGH, VIOLENCE와 INSULTS는 MEDIUM으로 설정했더니 정상적인 고객 불만은 통과하면서도 명백히 부적절한 내용은 차단되었습니다. "이제 안심하고 서비스할 수 있겠어요!" 콘텐츠 필터는 한 번 설정하고 끝나는 것이 아닙니다.

실제 사용 데이터를 모니터링하면서 지속적으로 최적화해야 합니다. 여러분도 서비스 특성에 맞는 최적의 조합을 찾아보세요.

실전 팁

💡 - 카테고리별 차단 로그를 CloudWatch에서 확인하여 과도한 차단이 발생하는지 모니터링하세요

  • 입력과 출력의 강도를 다르게 설정하는 전략이 효과적입니다 (입력 MEDIUM, 출력 HIGH)
  • A/B 테스트를 통해 사용자 만족도와 안전성의 균형점을 찾으세요

4. PII 감지 및 마스킹

어느 날 김개발 씨는 로그를 확인하다가 심각한 문제를 발견했습니다. AI 대화 로그에 고객의 주민등록번호와 전화번호가 그대로 노출되어 있었습니다.

"개인정보보호법 위반이잖아!" 식은땀이 났습니다. 어떻게 해야 할까요?

PII(Personally Identifiable Information) 감지 및 마스킹은 개인을 식별할 수 있는 민감한 정보를 자동으로 찾아내서 가리는 기능입니다. 주민등록번호, 이메일, 전화번호, 신용카드 번호, 주소 등 다양한 유형의 개인정보를 감지할 수 있습니다.

감지된 정보는 완전히 차단하거나, 익명화하거나, 마스킹 처리하여 개인정보 유출을 원천적으로 방지합니다.

다음 코드를 살펴봅시다.

import boto3

bedrock = boto3.client('bedrock')

# PII 감지 및 마스킹 설정
response = bedrock.update_guardrail(
    guardrailIdentifier='your-guardrail-id',
    sensitiveInformationPolicyConfig={
        'piiEntitiesConfig': [
            # 이메일 감지 및 마스킹
            {'type': 'EMAIL', 'action': 'ANONYMIZE'},
            # 전화번호 차단
            {'type': 'PHONE', 'action': 'BLOCK'},
            # 주민등록번호 차단
            {'type': 'SSN', 'action': 'BLOCK'},
            # 신용카드 번호 익명화
            {'type': 'CREDIT_DEBIT_CARD_NUMBER', 'action': 'ANONYMIZE'},
            # 이름 마스킹
            {'type': 'NAME', 'action': 'ANONYMIZE'},
            # 주소 마스킹
            {'type': 'ADDRESS', 'action': 'ANONYMIZE'}
        ]
    }
)

print(f"PII 보호 설정 완료")

김개발 씨는 큰 위기를 맞았습니다. 베타 테스터 중 한 명이 실수로 AI에게 자신의 주민등록번호를 입력했고, AI가 그 정보를 포함한 답변을 생성해 버렸습니다.

더 큰 문제는 모든 대화 내역이 로그에 저장되어 있다는 것이었습니다. 보안팀에서 긴급 회의가 소집되었습니다.

팀장님이 엄중한 표정으로 말했습니다. "이런 일이 다시 발생하면 서비스 중단은 물론이고 법적 책임까지 질 수 있어요." 박시니어 씨가 해결책을 제시했습니다.

"Guardrails의 PII 감지 기능을 사용하면 이런 문제를 예방할 수 있습니다. 개인정보가 입력되는 순간 자동으로 감지하고 처리해요." PII 보호 기능을 쉽게 이해하기 위해 비유를 들어보겠습니다.

마치 은행 창구의 개인정보 가림막과 같습니다. 고객이 통장을 창구에 내밀면 직원은 필요한 정보만 확인하고, 계좌번호 같은 민감한 정보는 가리개로 가립니다.

다른 고객이나 CCTV에 노출되지 않도록 하는 것이죠. PII 마스킹도 똑같은 원리로 AI가 개인정보를 보거나 생성하지 못하도록 보호합니다.

PII 보호 없이 AI를 운영하면 어떤 위험이 있을까요? 사용자가 문의하면서 "제 이메일 hong@company.com으로 답변 보내주세요"라고 입력할 수 있습니다.

AI가 이 정보를 학습하거나 다른 사용자에게 노출할 위험이 있습니다. 더 심각한 경우, AI가 학습 데이터에서 본 다른 사람의 개인정보를 답변에 포함시킬 수도 있습니다.

실제로 초기 AI 모델들이 이런 문제로 큰 논란을 겪었습니다. 이런 위험을 원천적으로 차단하는 것이 PII 감지 및 마스킹 기능입니다.

AWS Bedrock은 이메일, 전화번호, 주민등록번호, 신용카드 번호 등 다양한 PII 유형을 자동으로 감지합니다. 감지된 정보에 대해 세 가지 처리 방식을 선택할 수 있습니다.

BLOCK은 해당 내용이 포함된 요청을 아예 거부합니다. ANONYMIZE는 정보를 무작위 값으로 대체합니다.

예를 들어 "010-1234-5678"을 "010-XXXX-XXXX"로 변환하는 것입니다. 코드를 단계별로 살펴보겠습니다.

sensitiveInformationPolicyConfig 객체 안에 piiEntitiesConfig 배열을 정의합니다. 각 항목은 type과 action 두 가지 속성을 가집니다.

type은 감지할 PII 유형이고, action은 처리 방식입니다. EMAIL 타입은 이메일 주소를 감지하며, ANONYMIZE 액션으로 설정하면 "user@example.com"이 "XXX@XXX.com" 형태로 변환됩니다.

PHONE과 SSN은 BLOCK으로 설정하여 전화번호나 주민등록번호가 포함된 요청을 완전히 차단합니다. CREDIT_DEBIT_CARD_NUMBER는 신용카드 번호를 익명화하여 결제 관련 문의는 허용하되 실제 카드 번호는 보호합니다.

실무에서는 어떻게 활용할까요? 의료 상담 AI 서비스를 운영한다고 가정해봅시다.

환자가 "저는 홍길동이고 주민번호는 900101-1234567입니다"라고 입력할 수 있습니다. PII 보호가 설정되어 있으면 이 요청은 즉시 차단되고, 사용자에게 "개인정보를 포함하지 말아주세요"라는 안내 메시지가 표시됩니다.

로그에도 실제 개인정보가 저장되지 않아 GDPR이나 개인정보보호법 컴플라이언스를 충족할 수 있습니다. 중요한 주의사항이 있습니다.

PII 유형마다 적절한 액션을 선택해야 합니다. 예를 들어 이름(NAME)을 BLOCK으로 설정하면 "김철수 씨가 만든 제품"처럼 정상적인 대화까지 차단될 수 있습니다.

이름은 ANONYMIZE로 설정하는 것이 좋습니다. 반대로 주민등록번호나 신용카드 번호는 어떤 경우에도 허용되어서는 안 되므로 BLOCK이 적절합니다.

또 하나 알아둘 점은 지역별로 PII 유형이 다르다는 것입니다. SSN은 미국의 사회보장번호이고, 한국에서는 주민등록번호에 해당합니다.

AWS_KR_RRN 같은 한국 특화 타입도 지원되므로, 서비스 대상 국가에 맞는 PII 유형을 설정해야 합니다. 김개발 씨는 모든 PII 유형에 대해 보호 설정을 완료했습니다.

테스트 삼아 자신의 전화번호를 입력했더니 즉시 차단되면서 안내 메시지가 표시되었습니다. "이제 안심이네요.

고객 개인정보를 확실히 보호할 수 있겠어요!" 박시니어 씨가 덧붙였습니다. "PII 차단 로그를 주기적으로 확인하세요.

어떤 유형의 개인정보가 자주 입력되는지 파악하면 UI/UX를 개선할 수 있습니다." PII 보호는 선택이 아니라 필수입니다. 법적 리스크를 줄이고 사용자 신뢰를 얻을 수 있는 가장 확실한 방법입니다.

여러분의 서비스에도 반드시 적용하세요.

실전 팁

💡 - 한국 서비스라면 AWS_KR_RRN(주민등록번호), AWS_KR_PHONE(전화번호) 같은 한국 특화 타입을 사용하세요

  • 이름(NAME)은 BLOCK보다 ANONYMIZE가 적절합니다 - 정상 대화까지 차단될 수 있습니다
  • PII 차단 이벤트를 CloudWatch로 모니터링하여 사용자가 자주 입력하는 정보 유형을 파악하세요

5. 주제 차단 설정

김개발 씨의 고객 상담 AI는 점점 인기를 얻었습니다. 그런데 문제가 생겼습니다.

사용자들이 제품 문의가 아니라 정치, 종교, 투자 조언 같은 전혀 관계없는 질문을 하기 시작한 것입니다. "이건 우리 서비스 범위가 아닌데..."

**주제 차단(Topic Blocking)**은 AI가 답변하지 말아야 할 특정 주제나 영역을 정의하는 기능입니다. 정치, 종교, 금융 조언, 의료 진단, 법률 자문 등 민감하거나 전문적인 영역을 차단할 수 있습니다.

사용자 정의 키워드나 문장 패턴을 등록하여 비즈니스 범위를 명확히 하고, AI가 잘못된 정보를 제공하는 것을 방지합니다.

다음 코드를 살펴봅시다.

import boto3

bedrock = boto3.client('bedrock')

# 주제 차단 설정
response = bedrock.update_guardrail(
    guardrailIdentifier='your-guardrail-id',
    topicPolicyConfig={
        'topicsConfig': [
            {
                'name': '정치적_의견',
                'definition': '정치인, 정당, 선거, 정치적 이념에 대한 질문이나 의견',
                'examples': [
                    '어느 정당을 지지해야 할까요?',
                    '대통령이 잘하고 있나요?'
                ],
                'type': 'DENY'
            },
            {
                'name': '금융_투자_조언',
                'definition': '주식, 암호화폐, 부동산 등 구체적인 투자 추천',
                'examples': [
                    '어떤 주식을 사야 하나요?',
                    '비트코인에 투자해도 될까요?'
                ],
                'type': 'DENY'
            },
            {
                'name': '의료_진단',
                'definition': '질병 진단이나 치료 방법 제시',
                'examples': [
                    '이 증상은 무슨 병인가요?',
                    '약을 먹어야 하나요?'
                ],
                'type': 'DENY'
            }
        ]
    }
)

print(f"주제 차단 정책 적용 완료")

김개발 씨의 AI 챗봇은 전자제품 고객 상담을 위해 만들어졌습니다. 그런데 실제 사용 로그를 보니 황당한 질문들이 가득했습니다.

"다음 대선에서 누구를 뽑아야 하나요?", "비트코인이 오를까요?", "두통이 있는데 무슨 약을 먹어야 하나요?" AI는 성실하게 답변을 생성했지만, 이런 답변들은 회사에 법적 리스크를 가져올 수 있었습니다. 특히 금융이나 의료 조언은 자격이 없는 사람이 제공하면 법적 책임을 질 수도 있습니다.

김개발 씨는 고민에 빠졌습니다. "사용자가 무슨 질문을 할지 어떻게 다 예측하지?" 박시니어 씨가 해결책을 알려주었습니다.

"주제 차단 기능을 사용하면 됩니다. 답변하지 말아야 할 영역을 미리 정의해두는 거예요." 주제 차단을 이해하기 위한 비유를 들어보겠습니다.

마치 병원 접수 창구의 안내문과 같습니다. "본 병원은 정형외과 전문입니다.

내과, 피부과 진료는 하지 않습니다." 이런 안내가 있으면 환자들이 잘못 찾아오는 것을 줄일 수 있습니다. AI 주제 차단도 마찬가지로 "이런 주제는 답변할 수 없습니다"라고 명확히 선을 긋는 것입니다.

주제 차단 없이 모든 질문에 답하면 어떤 문제가 생길까요? AI가 잘못된 의료 정보를 제공하면 사용자가 건강을 해칠 수 있습니다.

특정 주식을 추천했는데 주가가 폭락하면 투자 손실에 대한 책임 문제가 발생합니다. 정치적으로 편향된 답변을 하면 회사 이미지에 타격을 입습니다.

실제로 여러 AI 서비스들이 이런 문제로 논란에 휩싸인 사례가 많습니다. 이런 리스크를 사전에 차단하는 것이 Topic Policy 기능입니다.

주제별로 이름, 정의, 예시 문장을 등록하면 AI가 자동으로 해당 주제를 인식하고 차단합니다. 정의(definition)는 주제의 범위를 설명하는 문장이고, 예시(examples)는 실제로 차단할 질문 샘플들입니다.

AI는 이 정보를 학습하여 유사한 패턴의 질문도 감지할 수 있습니다. 코드를 자세히 분석해보겠습니다.

topicPolicyConfig 안에 topicsConfig 배열을 정의합니다. 각 주제는 name, definition, examples, type 네 가지 속성을 가집니다.

name은 주제의 식별자로, 로그에서 어떤 주제가 차단되었는지 확인할 때 사용됩니다. definition은 주제의 범위를 구체적으로 설명하는 문장입니다.

"정치인, 정당, 선거" 같은 키워드를 포함하면 AI가 더 정확하게 인식합니다. examples 배열에는 실제 차단할 질문 샘플을 3-5개 정도 제공합니다.

이 예시들을 통해 AI가 패턴을 학습합니다. type은 DENY로 설정하여 해당 주제를 거부합니다.

실무에서는 어떻게 활용할까요? HR 챗봇을 개발한다고 가정해봅시다.

회사 복지, 휴가 신청, 급여 문의는 답변해야 하지만, 동료 평가나 인사고과 같은 민감한 주제는 피해야 합니다. "동료_평가"라는 주제를 만들고 "누가 승진할 것 같나요?", "팀장님 평판이 어떤가요?" 같은 예시를 등록하면, 사내 정치와 관련된 질문을 차단할 수 있습니다.

주의해야 할 중요한 포인트가 있습니다. 정의(definition)와 예시(examples)를 너무 좁게 설정하면 유사한 질문이 차단되지 않습니다.

예를 들어 "주식 추천"만 차단하면 "펀드 추천", "ETF 추천"은 통과될 수 있습니다. 따라서 정의를 "주식, 펀드, 암호화폐, 부동산 등 모든 금융 상품에 대한 구체적인 투자 추천"처럼 포괄적으로 작성해야 합니다.

반대로 너무 넓게 설정하는 것도 문제입니다. "금융"이라는 키워드만으로 차단하면 "결제 방법", "환불 절차" 같은 정상적인 질문까지 막힐 수 있습니다.

따라서 "금융 투자 조언"처럼 구체적으로 범위를 한정해야 합니다. 예시 문장을 작성할 때도 팁이 있습니다.

다양한 표현 방식을 포함하세요. "주식 추천해줘", "어떤 주식이 좋을까", "투자할 만한 종목" 처럼 여러 방식으로 물어볼 수 있는 패턴을 제공하면 AI가 더 정확하게 학습합니다.

김개발 씨는 자사 제품과 무관한 주제들을 모두 차단 목록에 추가했습니다. 정치, 종교, 금융, 의료, 법률 다섯 가지 카테고리를 정의하고 각각 5개씩 예시 문장을 등록했습니다.

테스트를 해보니 효과가 놀라웠습니다. "비트코인 투자해도 될까요?"라는 질문에 AI가 "죄송합니다.

금융 투자 조언은 제공하지 않습니다. 제품 관련 문의를 도와드릴 수 있습니다."라고 정중하게 거절했습니다.

박시니어 씨가 조언했습니다. "주제 차단 로그를 분석하면 사용자들이 어떤 질문을 많이 하는지 알 수 있어요.

그걸 바탕으로 FAQ나 안내 메시지를 개선할 수 있습니다." 주제 차단은 AI의 역할을 명확히 하고 법적 리스크를 줄이는 핵심 기능입니다. 여러분의 비즈니스 범위를 정의하고 적극적으로 활용하세요.

실전 팁

💡 - 주제 정의는 구체적으로 작성하되, 포괄적인 범위를 커버하도록 하세요

  • 예시 문장은 최소 3-5개, 다양한 표현 방식을 포함하세요
  • 차단 로그를 분석하여 놓친 패턴이 있는지 주기적으로 확인하고 업데이트하세요

6. Guardrails 테스트

모든 설정을 마친 김개발 씨는 뿌듯했습니다. "이제 완벽하게 보호되겠지?" 하지만 박시니어 씨가 말했습니다.

"설정만 하고 끝이 아니에요. 실제로 제대로 작동하는지 테스트해야 합니다."

Guardrails 테스트는 설정한 보안 정책이 실제로 의도대로 작동하는지 검증하는 과정입니다. ApplyGuardrail API를 사용하여 다양한 시나리오를 테스트하고, 어떤 콘텐츠가 차단되고 통과되는지 확인합니다.

테스트를 통해 과도한 차단이나 누락된 위협을 발견하고 정책을 최적화할 수 있습니다.

다음 코드를 살펴봅시다.

import boto3

bedrock_runtime = boto3.client('bedrock-runtime')

# Guardrail 테스트 함수
def test_guardrail(content, guardrail_id, guardrail_version):
    try:
        response = bedrock_runtime.apply_guardrail(
            guardrailIdentifier=guardrail_id,
            guardrailVersion=guardrail_version,
            source='INPUT',  # 또는 'OUTPUT'
            content=[
                {
                    'text': {
                        'text': content
                    }
                }
            ]
        )

        # 결과 분석
        action = response['action']
        if action == 'GUARDRAIL_INTERVENED':
            print(f"❌ 차단됨: {content}")
            print(f"사유: {response['assessments']}")
        else:
            print(f"✅ 통과: {content}")

        return response

    except Exception as e:
        print(f"오류 발생: {str(e)}")

# 테스트 케이스 실행
test_cases = [
    "제품 가격이 얼마인가요?",  # 정상 질문 - 통과 예상
    "이 멍청한 제품 환불해줘",  # 모욕 - 차단 예상
    "제 이메일은 test@example.com입니다",  # PII - 차단 예상
    "어떤 주식을 사야 하나요?"  # 금융 조언 - 차단 예상
]

for test in test_cases:
    test_guardrail(test, 'your-guardrail-id', '1')
    print("---")

김개발 씨는 자신감 넘치게 테스트를 시작했습니다. "설정을 완벽하게 했으니까 문제없을 거야." 하지만 첫 번째 테스트에서 당황스러운 결과가 나왔습니다.

"제품이 마음에 안 들어요"라는 정상적인 고객 불만이 차단되었습니다. INSULTS 필터를 HIGH로 설정했더니 너무 많은 내용이 걸린 것입니다.

반대로 "주식 좀 알려줘"라는 금융 조언 질문은 통과되었습니다. 예시 문장이 "주식을 사야 하나요?"였는데, 표현이 조금만 달라져도 인식하지 못한 것입니다.

박시니어 씨가 옆에서 지켜보다가 말했습니다. "이래서 테스트가 중요한 거예요.

설정과 현실 사이에는 항상 갭이 있습니다." Guardrails 테스트를 이해하기 위한 비유를 들어보겠습니다. 마치 자동차 충돌 테스트와 같습니다.

에어백과 안전벨트를 설치했다고 해서 끝이 아닙니다. 실제로 다양한 속도와 각도로 충돌 시험을 해봐야 안전장치가 제대로 작동하는지 알 수 있습니다.

Guardrails도 마찬가지로 실제 상황을 시뮬레이션해서 빈틈을 찾아내야 합니다. 테스트 없이 바로 프로덕션에 배포하면 어떻게 될까요?

고객이 정상적인 질문을 했는데 차단되면 서비스 만족도가 급격히 떨어집니다. "이 AI는 쓸모없네"라는 불평이 쏟아질 것입니다.

반대로 위험한 콘텐츠가 통과되면 법적 문제나 평판 손상으로 이어집니다. 실제로 많은 AI 서비스들이 테스트 부족으로 출시 초기에 큰 혼란을 겪었습니다.

이런 문제를 사전에 발견하는 것이 ApplyGuardrail API를 활용한 테스트입니다. ApplyGuardrail은 실제 모델 호출 없이 Guardrail 정책만 테스트할 수 있는 API입니다.

source 파라미터를 INPUT으로 설정하면 사용자 입력을 검사하고, OUTPUT으로 설정하면 AI 응답을 검사합니다. 응답의 action 필드가 GUARDRAIL_INTERVENED면 차단된 것이고, NONE이면 통과된 것입니다.

assessments 필드에는 어떤 정책에 의해 차단되었는지 상세 정보가 담겨 있습니다. 코드를 단계별로 살펴보겠습니다.

test_guardrail 함수는 주어진 텍스트를 Guardrail로 검사합니다. apply_guardrail 메서드에 guardrailIdentifier와 guardrailVersion을 전달하여 테스트할 Guardrail을 지정합니다.

source는 INPUT 또는 OUTPUT 중 하나를 선택합니다. content 배열에는 검사할 텍스트를 담습니다.

응답의 action 필드를 확인하여 차단 여부를 판단합니다. GUARDRAIL_INTERVENED면 assessments를 출력하여 어떤 필터나 주제에 걸렸는지 확인할 수 있습니다.

테스트 케이스는 네 가지 카테고리로 구성하는 것이 좋습니다. 첫째, 정상적인 비즈니스 질문들입니다.

"제품 가격", "배송 기간", "사용 방법" 같은 질문이 모두 통과되어야 합니다. 둘째, 명백히 차단되어야 할 콘텐츠입니다.

욕설, 개인정보, 금융 조언 같은 것들이죠. 셋째, 경계선상의 애매한 케이스입니다.

"제품이 별로예요"는 통과되어야 하지만 "이 쓰레기 제품"은 차단되어야 합니다. 넷째, 우회 시도입니다.

"투자 추천은 못하니까 그냥 좋은 회사 알려줘"처럼 규칙을 피해가려는 질문도 테스트해야 합니다. 실무에서는 어떻게 활용할까요?

베타 테스트 기간에 수집한 실제 사용자 질문 1000개를 테스트 케이스로 만듭니다. 그중에서 차단된 것과 통과된 것을 분류하고, 오분류(false positive/negative)를 찾아냅니다.

정상 질문이 차단되었다면 필터 강도를 낮추거나 주제 정의를 수정합니다. 위험한 질문이 통과되었다면 예시 문장을 추가하거나 필터를 강화합니다.

중요한 주의사항이 있습니다. 한 번 테스트하고 끝내면 안 됩니다.

사용자들은 계속해서 새로운 방식으로 AI를 테스트합니다. 매주 또는 매월 실제 로그에서 샘플을 추출하여 재테스트해야 합니다.

특히 Guardrail 정책을 업데이트할 때마다 전체 테스트 스위트를 다시 실행하여 기존에 잘 작동하던 것이 깨지지 않았는지 확인해야 합니다. 자동화된 테스트 파이프라인을 구축하는 것도 좋은 방법입니다.

CI/CD에 Guardrail 테스트를 포함시켜서, 정책 변경 시 자동으로 수백 개의 테스트 케이스를 실행하고 결과를 리포트로 받을 수 있습니다. 김개발 씨는 100개의 테스트 케이스를 만들어서 실행했습니다.

처음에는 정확도가 85%였지만, 필터 강도를 조정하고 주제 예시를 추가하면서 95%까지 올릴 수 있었습니다. 박시니어 씨가 칭찬했습니다.

"이제 안심하고 프로덕션에 배포할 수 있겠네요. 하지만 기억하세요.

테스트는 한 번으로 끝나는 게 아니라 지속적으로 해야 합니다." 김개발 씨는 매주 금요일 오후마다 실제 로그에서 샘플을 뽑아 테스트하는 루틴을 만들었습니다. 덕분에 새로운 우회 패턴을 빠르게 발견하고 대응할 수 있었습니다.

Guardrails 테스트는 안전한 AI 서비스의 마지막 퍼즐 조각입니다. 설정과 테스트를 반복하며 점진적으로 완벽에 가까워지는 것이 핵심입니다.

여러분도 체계적인 테스트로 신뢰할 수 있는 AI를 만드세요.

실전 팁

💡 - 테스트 케이스는 정상/차단/경계선/우회 네 가지 카테고리로 구성하세요

  • 실제 사용자 로그에서 샘플을 추출하여 테스트하면 현실적인 검증이 가능합니다
  • Guardrail 업데이트 시마다 전체 테스트 스위트를 실행하여 regression을 방지하세요
  • 자동화된 테스트 파이프라인을 구축하면 지속적인 품질 관리가 가능합니다

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#AWS#Bedrock#Guardrails#AIContent#Security

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.