Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

180 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

ContextCloak

LLM, ์—์ด์ „ํŠธ, ์™ธ๋ถ€ API๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— ๋ฏผ๊ฐํ•œ ๊ฐ’์„ ๊ฐ€๋ฆฌ๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ™์€ ์„ธ์…˜์—์„œ ๋‹ค์‹œ ๋˜๋Œ๋ฆฌ๋Š” ๋งˆ์Šคํ‚น API/SDK์ž…๋‹ˆ๋‹ค.

ContextCloak๋Š” LLM์ด ์•„๋‹™๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์ฒ˜๋ฆฌ ๋‹จ๊ณ„ ์•ž์— ๋†“์ด๋Š” ๋ณดํ˜ธ ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค.

ContextCloak Web UI

ํ•ต์‹ฌ ํ๋ฆ„

์›๋ณธ ๋ฌธ์žฅ
  -> ContextCloak๊ฐ€ ๋ฏผ๊ฐ์ •๋ณด ํƒ์ง€
  -> ์™ธ๋ถ€๋กœ ๋ณด๋‚ผ ๋ฌธ์žฅ ์ƒ์„ฑ
  -> ์™ธ๋ถ€ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์— ๋‚จ์€ ์ž„์‹œ ๊ฐ’
  -> ๊ฐ™์€ ์„ธ์…˜์—์„œ ์›๋ฌธ ๋งฅ๋ฝ์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ

์˜ˆ๋ฅผ ๋“ค์–ด API ํ‚ค, ์ด๋ฉ”์ผ, ์ „ํ™”๋ฒˆํ˜ธ, ๋‚ด๋ถ€ IP ๊ฐ™์€ ๊ฐ’์€ ์™ธ๋ถ€๋กœ ๋ณด๋‚ผ ๋ฌธ์žฅ์—์„œ [REDACTED_*] ํ˜•ํƒœ์˜ ์ž„์‹œ ๊ฐ’์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค. ์›๋ณธ๊ฐ’๊ณผ ์ž„์‹œ ๊ฐ’์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋Š” ๋ณต์›์„ ์œ„ํ•ด ์„ธ์…˜์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๋กœ๊ทธ์—๋Š” ์›๋ณธ๊ฐ’์„ ๋‚จ๊ธฐ์ง€ ์•Š๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

0. ์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

์•„๋ž˜ ๋ช…๋ น์–ด๋Š” Windows PowerShell ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. macOS/Linux๋Š” uv ๊ณต์‹ ์„ค์น˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด ๋™์ผํ•œ uv/git ๋ช…๋ น์„ ์…ธ์— ๋งž๊ฒŒ ์‹คํ–‰ํ•˜์„ธ์š”.

  • Python 3.11 ์ด์ƒ
  • uv (Windows PowerShell: powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex")
  • git
git clone https://github.com/Kyuhan1230/contextCloak.git
cd contextCloak

๋น ๋ฅธ ์‹œ์ž‘

1. ์„ค์น˜

uv sync

ํ…Œ์ด๋ธ”(CSV/TSV/Parquet) ๋งˆ์Šคํ‚น, ์›น UI "ํ…Œ์ด๋ธ”" ํƒญ, CLI masksยทprotect ๋ช…๋ น๊นŒ์ง€ ์“ฐ๋ ค๋ฉด pandas/pyarrow๊ฐ€ ํ•„์š”ํ•œ table extra๋ฅผ ํ•จ๊ป˜ ์„ค์น˜ํ•˜์„ธ์š”.

uv sync --extra table

AI ์ž‘์—…์šฉ ํ…Œ์ด๋ธ” ๋ณต์‚ฌ๋ณธ ๋งŒ๋“ค๊ธฐ

์ž๋™ ๊ฐ์‹œ๋‚˜ ์›๋ณธ ํŒŒ์ผ์˜ ์ž๋™ ๋ณ€ํ™˜์€ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ protect๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์›๋ณธ ์˜†์— ๋ณ„๋„์˜ ๋งˆ์Šคํ‚น ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

# data/๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  data-masked/ ์ƒ์„ฑ
uv run contextcloak protect .\data

# ์ถœ๋ ฅ ์ด๋ฆ„์„ ์ง์ ‘ ์ง€์ •
uv run contextcloak protect .\records.csv --output .\records-for-ai.csv

# ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ์‹: ์›๋ณธ์€ AI workspace ๋ฐ–์— ๋‘๊ณ  ๋ณต์‚ฌ๋ณธ๋งŒ ์•ˆ์œผ๋กœ ์ƒ์„ฑ
uv run contextcloak protect C:\private-data --output .\data-masked
  • ์ž…๋ ฅ์€ CSV, TSV, Parquet ํŒŒ์ผ ๋˜๋Š” ์ด ํŒŒ์ผ๋“ค์„ ๋‹ด์€ ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • ์›๋ณธ์€ ์ˆ˜์ •ยท์ด๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ถœ๋ ฅ์€ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ๋Š” ์ง€์› ํ…Œ์ด๋ธ”๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค๋ฅธ ํŒŒ์ผ์€ ๋ณต์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ถœ๋ ฅ์—๋Š” ContextCloak ๋ณต์›์šฉ ๋งคํ•‘์„ ๋‚จ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›๋ณธ์ด ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
  • AI ๋„๊ตฌ์—๋Š” ์›๋ณธ data/๊ฐ€ ์•„๋‹ˆ๋ผ ์ƒ์„ฑ๋œ data-masked/๋งŒ ์ œ๊ณตํ•˜์„ธ์š”.

๊ฐ€๋Šฅํ•˜๋ฉด ์›๋ณธ ํด๋” ์ž์ฒด๋ฅผ AI workspace ๋ฐ–์— ๋‘๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ฐ•ํ•œ ๊ฒฝ๊ณ„์ž…๋‹ˆ๋‹ค. protected_paths hook์€ ์‹ค์ˆ˜ ๋ฐฉ์ง€๋ฅผ ๋•์ง€๋งŒ ์šด์˜์ฒด์ œ์˜ ํŒŒ์ผ ๊ถŒํ•œ์„ ๋Œ€์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณต์›์ด ํ•„์š”ํ•œ ์—…๋ฌด๋Š” ๊ธฐ์กด Web UI, /v1/mask/table API ๋˜๋Š” SDK์˜ ์„ธ์…˜ ๊ธฐ๋ฐ˜ ํ๋ฆ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

NER(๊ฐœ์ฒด๋ช… ์ธ์‹) ํƒ์ง€๊นŒ์ง€ ์“ฐ๋ ค๋ฉด torch/transformers๊ฐ€ ํ•„์š”ํ•œ ner extra๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”. ๊ธฐ๋ณธ(uv sync)๋งŒ์œผ๋กœ๋Š” ์ •๊ทœ์‹ ํƒ์ง€๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

uv sync --extra ner

2. API ์„œ๋ฒ„ ์‹คํ–‰

uv run contextcloak-server

๋˜๋Š” ์ง์ ‘ uvicorn์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

uv run python -m uvicorn contextcloak.server.run:app --host 127.0.0.1 --port 18080

์ƒํƒœ ํ™•์ธ:

curl http://127.0.0.1:18080/health

์˜ˆ์ƒ ์‘๋‹ต:

{"status":"ok"}

3. ์›น UI ์—ด๊ธฐ

๋ธŒ๋ผ์šฐ์ €์—์„œ ์•„๋ž˜ ์ฃผ์†Œ๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

http://127.0.0.1:18080/ui

์›น UI์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ:

  • ์›๋ณธ ๋ฌธ์žฅ์—์„œ ๋ฏผ๊ฐํ•œ ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋ ค์ง€๋Š”์ง€
  • ์™ธ๋ถ€๋กœ ๋ณด๋‚ผ ๋ฌธ์žฅ์— ์›๋ณธ๊ฐ’์ด ๋น ์ง€๋Š”์ง€
  • ๊ฐ™์€ ์„ธ์…˜์—์„œ ๊ฐ€๋ฆฐ ๊ฐ’์„ ๋‹ค์‹œ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€
  • ํ˜„์žฌ ํƒ์ง€ ๋ฐฉ์‹์ด ์ •๊ทœ์‹์ธ์ง€ ์ •๊ทœ์‹ + NER์ธ์ง€
  • ๋‹คํฌ/๋ผ์ดํŠธ/์‹œ์Šคํ…œ ํ…Œ๋งˆ ์ „ํ™˜

๋ฐฐ์ง€์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ํ˜„์žฌ ๋กœ์ปฌ API์™€ ํƒ์ง€ ๋ชจ๋“œ ์„ค๋ช…์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์›น UI๋Š” same-origin ContextCloak API๋งŒ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์™ธ๋ถ€ LLM์ด๋‚˜ SaaS๋กœ ์ž…๋ ฅ์„ ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

SDK ์‚ฌ์šฉ ์˜ˆ์‹œ

Windows ์ฝ˜์†”์—์„œ ํ•œ๊ธ€ ์ถœ๋ ฅ์ด ๊นจ์ง„๋‹ค๋ฉด PowerShell์—์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•œ ๋’ค ์‹คํ–‰ํ•˜์„ธ์š”.

$env:PYTHONIOENCODING="utf-8"
uv run python script.py
from contextcloak import ContextCloak

agent = ContextCloak(base_url="http://127.0.0.1:18080")
session = agent.session(ttl_seconds=3600)  # session_id๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์ž๋™ ์ƒ์„ฑ

masked = session.mask_text('api_key="sk-12345678901234567890"')
print(masked.masked_text)

external_response = "๋ถ„์„ ๊ฒฐ๊ณผ: [REDACTED_CREDENTIALS] ๊ฐ’์ด ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค."
restored = session.unmask_text(external_response)
print(restored)

session.close()
agent.close()

์˜ˆ์ƒ ์ถœ๋ ฅ:

api_key="[REDACTED_CREDENTIALS]"
๋ถ„์„ ๊ฒฐ๊ณผ: sk-12345678901234567890 ๊ฐ’์ด ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

HTTP API

์ฃผ์š” endpoint:

GET    /health
POST   /v1/sessions
POST   /v1/mask/text
POST   /v1/unmask/text
DELETE /v1/sessions/{session_id}
GET    /ui
GET    /ui/status
POST   /ui/external-response

๋งˆ์Šคํ‚น ์š”์ฒญ:

POST /v1/mask/text
Content-Type: application/json

{
  "session_id": "analysis-001",
  "text": "admin email is hong.gildong@corp.example and host is 10.23.17.44"
}

์‘๋‹ต ์˜ˆ์‹œ:

{
  "masked_text": "admin email is [REDACTED_PII_EMAIL] and host is [REDACTED_INFRA]",
  "session_id": "analysis-001",
  "detected_categories": ["PII_EMAIL", "INFRA"],
  "placeholder_counts": {"PII_EMAIL": 1, "INFRA": 1},
  "strategies_applied": {"PII_EMAIL": "reversible", "INFRA": "reversible"},
  "restorable": true
}

๋ณต์› ์š”์ฒญ:

POST /v1/unmask/text
Content-Type: application/json

{
  "session_id": "analysis-001",
  "text": "review [REDACTED_PII_EMAIL] and [REDACTED_INFRA]"
}

ํƒ์ง€ ๋ฐฉ์‹

ContextCloak๋Š” ์ •๊ทœ์‹ ๊ธฐ๋ฐ˜ ํƒ์ง€๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •๊ณผ ๋ชจ๋ธ ์ƒํƒœ์— ๋”ฐ๋ผ NER๊ฐ€ ํ•จ๊ป˜ ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›น UI์˜ ํƒ์ง€ ๋ฐฐ์ง€๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํƒ์ง€: ์ •๊ทœ์‹
ํƒ์ง€: ์ •๊ทœ์‹ + NER

GET /ui/status๋Š” ์›น UI๊ฐ€ ํ‘œ์‹œํ•  ํƒ์ง€ ๋ชจ๋“œ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

{
  "detection_mode": "ํƒ์ง€: ์ •๊ทœ์‹ + NER",
  "ner_requested": true,
  "ner_config_enabled": true,
  "ner_model_exists": true,
  "ner_active": true,
  "detail": "์ •ํ•ด์ง„ ํŒจํ„ด๊ณผ NER(๊ฐœ์ฒด๋ช… ์ธ์‹)๋ฅผ ์‚ฌ์šฉํ•ด ๋ฏผ๊ฐ์ •๋ณด ํ›„๋ณด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค."
}

๋งˆ์Šคํ‚น ์ „๋žต

๋ฃฐ๊ณผ ์š”์ฒญ ์˜ต์…˜์— ๋”ฐ๋ผ ํ‘œ์‹œ ๋ฐฉ์‹์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

strategy ์˜ˆ์‹œ ์ž…๋ ฅ ์˜ˆ์‹œ ์ถœ๋ ฅ ์šฉ๋„
reversible api_key="sk-..." api_key="[REDACTED_CREDENTIALS]" ๊ฐ™์€ ์„ธ์…˜์—์„œ ๋ณต์›ํ•ด์•ผ ํ•˜๋Š” ๊ฐ’
partial 10.23.17.44 10.x.xx.xxx ์ผ๋ถ€ ํ˜•ํƒœ๋งŒ ๋ณด์—ฌ๋„ ๋˜๋Š” ๊ฐ’
pseudonym James Bond PERSON_001 ์‚ฌ๋žŒ/์„œ๋น„์Šค/์—…๋ฌด ๊ฐ์ฒด alias
passthrough TI-101 TI-101 ์ •์ฑ…์ƒ ๊ทธ๋Œ€๋กœ ํ†ต๊ณผํ•˜๋Š” ๊ฐ’

์š”์ฒญ ์˜ˆ์‹œ:

masked = session.mask_text(
    "operator James Bond connected from 10.23.17.44",
    options={
        "category_strategies": {
            "PERSON": "pseudonym",
            "INFRA": "partial",
        }
    },
)

print(masked.masked_text)

ํ…Œ์ด๋ธ” ๋งˆ์Šคํ‚น ์ „๋žต

CSV/DataFrame/Parquet ํ…Œ์ด๋ธ”์€ ์ปฌ๋Ÿผ dtype๊ณผ ์ƒ˜ํ”Œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ „๋žต์„ ์ถ”๋ก ํ•˜๊ณ , credential ํ˜•์‹์€ ์ผ๋ถ€ ํ–‰์„ ๋†“์น˜์ง€ ์•Š๋„๋ก ์ „์ฒด non-null ๊ฐ’์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

strategy ์ ์šฉ ๋Œ€์ƒ ๋™์ž‘
standard_scale ์ˆซ์ž ์ปฌ๋Ÿผ ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๊ฐ™์€ ์„ธ์…˜์—์„œ ๋ณต์›
pseudonym ๋ฌธ์ž์—ด ์ปฌ๋Ÿผ PERSON_001 ๊ฐ™์€ session-local alias๋กœ ์น˜ํ™˜
partial IP ๋“ฑ ์ผ๋ถ€ ํ˜•์‹์„ ์œ ์ง€ํ•  ๊ฐ’ ์ผ๋ถ€ ๊ตฌ์กฐ๋งŒ ๋‚จ๊ธฐ๊ณ  ๊ฐ’ ์น˜ํ™˜
date_shift datetime dtype, ISO date/datetime ๋ฌธ์ž์—ด -371์ผ ์ด๋™ํ•ด ์š”์ผ์„ ์œ ์ง€ํ•˜๊ณ  ๊ฐ™์€ ์„ธ์…˜์—์„œ ๋ณต์›
passthrough bool ๋˜๋Š” ๋ช…์‹œ์ ์œผ๋กœ ํ†ต๊ณผ์‹œํ‚จ ์ปฌ๋Ÿผ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ

date_shift์˜ ์ด๋™๊ฐ’์€ -371์ผ, ์ฆ‰ 53 * 7์ผ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ ์งœ๋Š” ๋‹ฌ๋ผ์ง€์ง€๋งŒ ์š”์ผ ํŠน์„ฑ์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. CSV์˜ ISO YYYY-MM-DD ๋‚ ์งœ ๋ฌธ์ž์—ด๊ณผ Parquet์˜ datetime ์ปฌ๋Ÿผ์— ์ž๋™ ์ ์šฉ๋˜๋ฉฐ, ์ปฌ๋Ÿผ override๋กœ passthrough๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์„ค์ •

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ธฐ๋ณธ๊ฐ’ ์„ค๋ช…
CONTEXTCLOAK_HOST 127.0.0.1 API ์„œ๋ฒ„ bind host
CONTEXTCLOAK_PORT 18080 API ์„œ๋ฒ„ port
CONTEXTCLOAK_BASE_URL http://127.0.0.1:18080 SDK๊ฐ€ ํ˜ธ์ถœํ•  API ์„œ๋ฒ„ URL
CONTEXTCLOAK_CONFIG_DIR ๊ธฐ๋ณธ config ๊ฒฝ๋กœ ๋ฃฐ/ํ”„๋กœ์ ํŠธ ์„ค์ • ๋””๋ ‰ํ„ฐ๋ฆฌ
CONTEXTCLOAK_PROJECTS_ROOT ~/Projects projects.yaml์˜ ํ”„๋กœ์ ํŠธ ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ
CONTEXTCLOAK_PROJECT ์—†์Œ ์‚ฌ์šฉํ•  project ์ด๋ฆ„
CONTEXTCLOAK_USE_NER true NER ์‚ฌ์šฉ ์š”์ฒญ ์—ฌ๋ถ€
CONTEXTCLOAK_VAULT_PATH logs/contextcloak-vault.sqlite SQLite session ๋ณต์› ๋งคํ•‘ ์ €์žฅ์†Œ

์˜ˆ์‹œ:

$env:CONTEXTCLOAK_USE_NER="false"
uv run contextcloak-server

SQLite Vault ์˜ˆ์‹œ:

$env:CONTEXTCLOAK_VAULT_PATH="C:\ContextCloak\vault.sqlite"
uv run contextcloak-server

SQLite Vault ํŒŒ์ผ์—๋Š” ๋ณต์›์— ํ•„์š”ํ•œ ์›๋ณธ ๋ฏผ๊ฐ๊ฐ’์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํŒŒ์ผ ๊ถŒํ•œ, ๋””์Šคํฌ ์•”ํ˜ธํ™”, ๋ฐฑ์—… ์ •์ฑ…, ๋ณด๊ด€ ๊ธฐ๊ฐ„์„ ๋ณ„๋„๋กœ ํ†ต์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šด์˜ ์ฃผ์˜์ 

  • ๋งˆ์Šคํ‚น์€ ์œ ์ถœ ์œ„ํ—˜์„ ๋‚ฎ์ถ”๋Š” ๋ณดํ˜ธ ๋ ˆ์ด์–ด์ด์ง€, ์ „์ฒด ๋ณด์•ˆ ํ†ต์ œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณต์›์€ ๊ฐ™์€ ์„ธ์…˜์˜ ์—ฐ๊ฒฐ ์ •๋ณด์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ID์™€ TTL์„ ์—…๋ฌด ๋‹จ์œ„์— ๋งž๊ฒŒ ๋ถ„๋ฆฌํ•˜์„ธ์š”.
  • ์™ธ๋ถ€ LLM/API์—๋Š” ์›๋ณธ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๋งˆ์Šคํ‚น๋œ ๋ฌธ์žฅ๋งŒ ์ „๋‹ฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ํ˜ธ์ถœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ธ์ฆ, ์ ‘๊ทผ ์ œ์–ด, ๊ฐ์‚ฌ ์ •์ฑ…, ์˜์† Vault ์ €์žฅ์†Œ๋ฅผ ๋ณ„๋„๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฏผ๊ฐ ์›๋ณธ๊ฐ’์„ ๋กœ๊ทธ์— ๋‚จ๊ธฐ์ง€ ์•Š๋Š” ์ •์ฑ…์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ง€์› ๋ฒ”์œ„

์˜์—ญ ์ƒํƒœ
ํ…์ŠคํŠธ ๋งˆ์Šคํ‚น/๋ณต์› API ์ง€์›
Python SDK ์ง€์›
์„ธ์…˜ ๊ธฐ๋ฐ˜ ๋ณต์› ์ง€์›
์›น UI ์ง€์›
์ •๊ทœ์‹ ํƒ์ง€ ์ง€์›
NER ํƒ์ง€ ์„ค์ •/๋ชจ๋ธ ์ƒํƒœ์— ๋”ฐ๋ผ ์ง€์› (uv sync --extra ner ํ•„์š”)
DataFrame/CSV/TSV/Parquet ๋กœ์ปฌ ๋งˆ์Šคํ‚น ์„œ๋น„์Šค ์ œ๊ณต (uv sync --extra table ํ•„์š”)
CSV/TSV/Parquet ์ˆ˜๋™ ๋ณดํ˜ธ ๋ณต์‚ฌ๋ณธ CLI ์ง€์› (contextcloak protect)
์›๋ณธ ํด๋” ์ž๋™ ๊ฐ์‹œยท์ž๋™ ๋ณ€ํ™˜ ์ง€์›ํ•˜์ง€ ์•Š์Œ (๋ช…์‹œ์  ์‹คํ–‰ ์›์น™)
์›๊ฒฉ Parquet ์—…๋กœ๋“œ API ์˜ˆ์ •
์ธ์ฆ/๊ถŒํ•œ ์šด์˜ ๋ฐฐํฌ ์ „ ์ถ”๊ฐ€ ํ•„์š”

secureAgent ํ˜ธํ™˜์„ฑ

๊ธฐ์กด secureagent import, CLI, ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” ํ˜ธํ™˜์„ ์œ„ํ•ด ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ๊ตฌํ˜„ ๊ธฐ์ค€์€ contextcloak.*์ด๋ฉฐ, ์ƒˆ ์ฝ”๋“œ์—์„œ๋Š” contextcloak import์™€ CONTEXTCLOAK_* ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์•„ํ‚คํ…์ฒ˜

์ œํ’ˆ ๋ณธ์„ ์€ Python SDK๊ฐ€ HTTP API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , API๊ฐ€ ์„œ๋น„์Šคยทํƒ์ง€ยทVault ๊ณ„์ธต์„ ์กฐํ•ฉํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

Python SDK
  -> HTTP API
  -> masking/session services
  -> detector, policy, table transformer
  -> SQLite Vault

์‚ฌ์šฉ์ž ๋ช…์‹œ ์‹คํ–‰
  -> protect CLI
  -> ์›๋ณธ ์œ ์ง€ + ๋ณ„๋„ ๋งˆ์Šคํ‚น ๋ณต์‚ฌ๋ณธ
  • SDK๋Š” Vault๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • core๋Š” ํƒ์ง€์™€ ๋งˆ์Šคํ‚น ๊ทœ์น™์„, services๋Š” ์œ ์Šค์ผ€์ด์Šค ์กฐํ•ฉ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • api์™€ server๋Š” HTTP ๊ณ„์•ฝ๊ณผ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • proxy์™€ mitm์€ ํ˜ธํ™˜ยท์ง„๋‹จ ๊ฒฝ๋กœ์ด๋ฉฐ ๊ธฐ๋ณธ SDK/API ํ๋ฆ„์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • DataFrame/Parquet ์ฒ˜๋ฆฌ๋Š” ๋กœ์ปฌ ์„œ๋น„์Šค์™€ Web UI์—์„œ ์ œ๊ณตํ•˜๋ฉฐ ํ˜„์žฌ HTTP SDK ๊ณต๊ฐœ API์—๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • protect๋Š” ๋ณ„๋„ ๋ณต์‚ฌ๋ณธ๋งŒ ๋งŒ๋“ค๊ณ  ๋ณต์› metadata๋ฅผ ์ฆ‰์‹œ ํ๊ธฐํ•˜๋Š” ๋กœ์ปฌ ์ผํšŒ์„ฑ ํ๋ฆ„์ž…๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ๋ฌธ์„œ

๊ตฌํ˜„๊ณผ ํ•จ๊ป˜ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๊ณ„์•ฝ์€ ๊ฐ ๋ชจ๋“ˆ README์— ๋‘ก๋‹ˆ๋‹ค.

์˜์—ญ ๋ฌธ์„œ
ํŒจํ‚ค์ง€ ๊ตฌ์กฐ์™€ ๊ณต๊ฐœ API contextcloak/README.md
์„ค์ •๊ณผ ํƒ์ง€ ๋ฃฐ config/README.md
Web UI contextcloak/webui/README.md
ํ…Œ์ด๋ธ” ๋งˆ์Šคํ‚น contextcloak/table/README.md
Claude Code hooks contextcloak/hooks/README.md
Vault contextcloak/vault/README.md
MITM ์ง„๋‹จ ๊ฒฝ๋กœ contextcloak/mitm/README.md
์šด์˜ยท๊ฒ€์ฆ ์Šคํฌ๋ฆฝํŠธ scripts/README.md

๊ฐœ๋ฐœ

ํ…Œ์ŠคํŠธ ์‹คํ–‰:

uv run pytest

์›น UI ๊ด€๋ จ ํ…Œ์ŠคํŠธ๋งŒ ์‹คํ–‰:

uv run pytest tests/test_web_ui.py

ํƒ์ง€ ํ’ˆ์งˆ ๋ฆฌํฌํŠธ:

uv run python scripts\evaluate_detection_quality.py

Privacy Filter ๋ชจ๋ธ ์„ค์น˜์™€ ๋กœ์ปฌ ๋กœ๋“œ ๊ฒ€์ฆ (uv sync --extra ner ๋จผ์ € ํ•„์š”):

uv run python scripts\setup_privacy_filter_model.py
uv run python scripts\setup_privacy_filter_model.py --skip-download
uv run pytest -q tests/test_privacy_filter_local_model.py

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages