AI 에이전트가 직원 데이터를 접할 때 사용하는 보안 모델

발행: (2026년 6월 18일 PM 07:48 GMT+9)
5 분 소요
원문: Dev.to

출처: Dev.to

There is a category of AI deployment that I treat with significantly more caution than others: AI agents that have read or write access to data about individual employees.
The caution is not about the AI being untrustworthy in an abstract sense. It is about the specific combination of capabilities, data sensitivity, and audit requirements that come together when employee data is involved. Get this wrong and you are not dealing with a bug. You are dealing with a data protection incident.

Here is the security model I apply consistently across these deployments.

Principle one: Separate read agents from write agents. Always.

I have seen architectures where a single AI agent has both read access to employee records and write access to update them based on reasoning. This makes me uncomfortable regardless of how good the reasoning logic is.
Read‑only agents for employee data: fine, with proper access scoping. Write agents for employee data: require a human approval step before any write executes. No exceptions. The value of an AI agent that can draft a performance review note and write it to the HR system in one automated step does not outweigh the risk of a write based on incorrect inference landing in a permanent personnel record.

class EmployeeDataAgent:
    def  __init__(self, mode: str):
        assert mode in ("read", "propose"), "Write mode not permitted for employee data agents"
        self.mode = mode

    def update_employee_record(self, employee_id, field, value, justification):
        if self.mode == "read":
            raise PermissionError("This agent is read-only")

        # mode == "propose": create a pending change request, not a direct write
        return PendingChange(
            employee_id=employee_id,
            field=field,
            proposed_value=value,
            justification=justification,
            requires_approval_from=self.get_approver(employee_id, field),
            expires_at=datetime.now() + timedelta(hours=48)
         )

The pending change model means every AI‑proposed modification to employee data sits in a review queue until a human approves it. The human approval is the write. The AI is a drafting tool.

Principle two: Every query against employee data generates an immutable audit record.

Not an application log that can be modified. An immutable audit record in a separate store that preserves: who triggered the query (user or automated process), what was asked, which employee records were accessed, what was returned, and a correlation ID that links back to the session or workflow that initiated the request.

from dataclasses import dataclass
from typing import Optional
import hashlib

@dataclass
class EmployeeDataAuditRecord:
    record_id: str
    timestamp: str
    initiated_by: str                # user_id or service_name
    query_fingerprint: str           # hash of query, not raw query
    employee_ids_accessed: list      # list of affected employee IDs
    fields_accessed: list            # list of field names returned
    access_tier: str
    session_correlation_id: str
    approved_by: Optional[str]       # for write operations

def create_audit_record(initiated_by, query, results, session_id):
    return EmployeeDataAuditRecord(
        record_id=generate_uuid(),
        timestamp=datetime.now().isoformat(),
        initiated_by=initiated_by,
        query_fingerprint=hashlib.sha256(query.encode()).hexdigest(),
        employee_ids_accessed=[r.employee_id for r in results],
        fields_accessed=list(set([f for r in results for f in r.fields_returned])),
        access_tier=determine_tier(results),
        session_correlation_id=session_id,
        approved_by=None
     )

Store these in a write‑once log. If someone asks you in six months who accessed what employee data and when, you need to be able to answer specifically. “We had audit logging” is not an answer. A queryable, tamper‑evident record is.

Principle three: Scope inference to the minimum context required.

When an AI agent needs to reason about an employee, it should receive only the fields required for the specific task, not the entire employee record.

A performance review drafting agent needs the employee’s current role, their stated goals from the previous period, and their manager’s structured feedback. It does not need their compensation history, their hiring channel, or their previous manager’s notes. Give it what it needs. Nothing else.

def get_employee_context_for_task(employee_id: str, task_type: str) -> dict:
    TASK_FIELD_MAP = {
        "performance_review_draft": ["current_role", "current_goals", "manager_feedback", "peer_feedback"],
        "onboarding_checklist": ["start_date", "department", "manager_id", "role_level"],
        "benefits_inquiry": ["employment_type", "country", "benefits_tier"],
    }
    allowed_fields = TASK_FIELD_MAP.get(task_type, [])
    if not allowed_fields:
        raise ValueError(f"Unknown task type: {task_type}")

    full_record = employee_db.get(employee_id)
    return {k: full_record[k] for k in allowed_fields if k in full_record}

This pattern has two benefits. It limits data exposure if something goes wrong at the inference layer. It also produces cleaner, more focused AI outputs because the model is not reasoning over irrelevant context.

On where inference runs

I want to flag something that gets skipped in most architecture discussions. All of the access control and audit logging above addresses the internal security model. It does not address what happens when the assembled employee data context is sent to an external LLM inference endpoint.

For many enterprise deployments, external inference with enterprise agreements is acceptable. For deployments involving personally identifiable employee information in jurisdictions with strict data protection laws, particularly health data, immigration status, or anything that qualifies as special category data under GDPR, external inference is harder to justify even with strong contractual protections.

The architecturally clean solution for those cases is self‑hosted inference. The employee data context never leaves your network because inference happens inside it. Platforms like PrivOS (https://privos.ai/) that combine self‑hosted inference with built‑in workspace and access control handling are worth evaluating for deployments in this category, since the alternative is assembling the self‑hosted stack yourself which carries its own complexity.

The security model described above is the right model regardless of where inference runs. The inference location is a separate decision layered on top of it.

0 조회
Back to Blog

관련 글

더 보기 »

코드 리뷰가 잘못됐다

!Cover image for Code Review Gone Wronghttps://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Flavkesh.com%2F...