Skip to content

PII/Sensitive Data Cache'leme: KVKK/GDPR Riski

Kullanıcı verilerini (TCKN, email, kart no) cache'lemek hukuki tehlikeler doğurur. Compliance pattern'leri ve PII redaction stratejileri.

Şükrü Yusuf KAYA
12 min read
Intermediate

Anti-Pattern 1: PII'yi Cache'lemek

Cache provider'da saklanır (Anthropic, OpenAI, Gemini). Yani:
  • Anthropic'in sunucularında senin user verilerin var
  • TTL boyunca o veriler "in transit / at rest" durumda
  • KVKK madde 5/6: hassas veri işlenmesi için açık rıza şart
Hukuki Risk
Türk şirketleri: Bir müşteri TCKN'sini chatbot'a verdi, asistan cache'ledi. KVKK uyumlu mu? Kanunen veri merkezinin nerede olduğu (Anthropic US-based) ek izin gerektirir.

Tehdit Senaryoları#

Müşteri "TCKN'im 12345678901" yazdı, system + KB + this message cache'lendi. Cache 5dk-1h dayanır. Bu süre içinde provider tarafında bu veri persist eder.
Risk: Veri leak (provider breach), audit trail eksikliği, KVKK 4/5 ihlali.

Çözüm 1: PII Redaction Pre-LLM#

python
import re
 
PII_PATTERNS = [
(r'\b\d{11}\b', '[TCKN]'), # TCKN
(r'\b\d{4}[- ]?\d{4}[- ]?\d{4}[- ]?\d{4}\b', '[CARD]'), # Kart
(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', '[EMAIL]'),
(r'\b(05|5)\d{9}\b', '[PHONE]'), # TR cep
(r'\bTR\d{2}[\d ]{20,30}\b', '[IBAN]'),
]
 
def redact_pii(text: str) -> str:
"""PII'yi placeholder ile değiştir."""
for pattern, replacement in PII_PATTERNS:
text = re.sub(pattern, replacement, text)
return text
 
# Önce redact, sonra LLM'e gönder
clean_query = redact_pii(user_query)
response = client.messages.create(
messages=[{"role": "user", "content": clean_query}]
)
PII redaction
Avantaj: Cache'te PII yok, compliance garantili. Dezavantaj: LLM redacted veriyi anlamlandıramayabilir. Use case'e göre değerlendir.

Çözüm 2: PII İçeren İstekleri Cache'leme#

python
def has_pii(text: str) -> bool:
for pattern, _ in PII_PATTERNS:
if re.search(pattern, text):
return True
return False
 
def make_request(user_query):
if has_pii(user_query):
# PII içerir → cache YAPMA (system prompt'a cache_control koyma)
return client.messages.create(
system=SYSTEM, # plain string, cache yok
messages=[{"role": "user", "content": user_query}],
)
else:
# Normal cache'li request
return client.messages.create(
system=[{"text": SYSTEM, "cache_control": {"type": "ephemeral"}}],
messages=[{"role": "user", "content": user_query}],
)
Conditional caching

Çözüm 3: Self-Hosted (on-prem)#

Modül 10'da self-hosted gördük. vLLM/SGLang ile data tamamen senin altyapında. KVKK için en güvenli yol.
Tradeoff: Setup ve operasyon maliyeti.

Audit ve Veri Sahipliği#

KVKK uyumu için:
  1. Kullanıcı rızası — cache'te veri tutulacağına dair açık onay
  2. Audit log — hangi user'ın hangi veriyi cache'lediği
  3. Delete request — user "verimi sil" derse cache invalidation prosedürü
  4. Data residency — provider'ın veri merkezi nerede (Anthropic US-only)

✓ Pekiştir#

Bir Sonraki Derste#

Invisible regression — cache hit rate'in farkına vardırmadan düşmesi.

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

Related Content

Connected pillar topics

Pillar topics this article maps to