⚖️ AI 규제/윤리

마이데이터

개인이 자신의 데이터를 관리하고 활용하는 서비스

상세 설명

마이데이터(MyData)는 개인이 자신의 데이터에 대한 통제권을 행사하며, 여러 기관에 흩어진 자신의 정보를 한 곳에서 조회하고 관리할 수 있는 서비스입니다. 한국에서는 2022년 1월 금융 분야 본인신용정보관리업(마이데이터)이 시행되었으며, 2024년까지 의료, 공공 등 다른 분야로 확대 중입니다.

마이데이터의 법적 근거는 신용정보법 제22조의9(개인신용정보 전송요구권)이며, 이는 GDPR 제20조의 데이터 이동권(Right to Data Portability)과 유사합니다. 개인은 금융회사, 의료기관 등에 보관된 자신의 데이터를 표준화된 형식으로 전송받아 다른 서비스에서 활용할 수 있습니다.

AI와의 관계에서 마이데이터는 두 가지 함의가 있습니다. 첫째, 마이데이터 사업자는 개인화된 AI 서비스(맞춤 금융상품 추천 등)를 제공하는데, 이때 AI 알고리즘의 투명성과 설명 의무가 필요합니다. 둘째, 개인이 자신의 데이터 제공 범위를 선택할 수 있어, AI 학습 데이터 조달의 새로운 채널이 될 수 있습니다.

마이데이터 사업 허가를 위해서는 금융위원회의 본인신용정보관리업 허가가 필요하며, 자본금 5억 원 이상, 정보보호 체계, 내부통제 기준 등의 요건을 충족해야 합니다. 2024년 기준 약 60개 사업자가 허가를 받아 운영 중입니다.

코드 예제

# 마이데이터 API 연동 예제 (금융 분야)
import requests
from datetime import datetime
from dataclasses import dataclass
from typing import List, Dict, Optional
from enum import Enum

class ConsentScope(Enum):
    """마이데이터 동의 범위"""
    ACCOUNT_INFO = "account_info"          # 계좌 정보
    TRANSACTION_HISTORY = "transaction"    # 거래 내역
    CREDIT_SCORE = "credit_score"          # 신용 점수
    INSURANCE = "insurance"                 # 보험 정보
    INVESTMENT = "investment"               # 투자 정보

@dataclass
class MyDataConsent:
    """마이데이터 전송요구 동의"""
    consent_id: str
    user_ci: str                           # 연계정보 (CI)
    scopes: List[ConsentScope]
    target_org: str                        # 정보 제공 기관
    valid_until: datetime
    purpose: str                           # 이용 목적

class MyDataClient:
    """마이데이터 API 클라이언트 (금융보안원 표준 기반)"""

    def __init__(self, client_id: str, client_secret: str,
                 org_code: str):
        self.client_id = client_id
        self.client_secret = client_secret
        self.org_code = org_code
        self.base_url = "https://api.mydata.go.kr"
        self.access_token: Optional[str] = None

    def authenticate(self, authorization_code: str) -> str:
        """OAuth 2.0 인증 (사용자 동의 후)"""
        response = requests.post(
            f"{self.base_url}/oauth/2.0/token",
            data={
                "grant_type": "authorization_code",
                "code": authorization_code,
                "client_id": self.client_id,
                "client_secret": self.client_secret
            }
        )
        self.access_token = response.json()["access_token"]
        return self.access_token

    def request_data_transfer(self, consent: MyDataConsent) -> Dict:
        """개인신용정보 전송요구 (신용정보법 제22조의9)"""
        headers = {
            "Authorization": f"Bearer {self.access_token}",
            "x-api-tran-id": f"{self.org_code}-{datetime.now().strftime('%Y%m%d%H%M%S')}"
        }

        payload = {
            "user_ci": consent.user_ci,
            "org_code": consent.target_org,
            "scopes": [s.value for s in consent.scopes],
            "valid_period": consent.valid_until.isoformat(),
            "purpose": consent.purpose
        }

        response = requests.post(
            f"{self.base_url}/v1/transfer/request",
            headers=headers,
            json=payload
        )

        return response.json()

    def get_account_list(self, user_ci: str, org_code: str) -> List[Dict]:
        """계좌 목록 조회"""
        headers = {"Authorization": f"Bearer {self.access_token}"}
        response = requests.get(
            f"{self.base_url}/v1/bank/accounts",
            headers=headers,
            params={"org_code": org_code}
        )
        return response.json().get("accounts", [])

    def get_transactions(self, account_num: str,
                          from_date: str, to_date: str) -> List[Dict]:
        """거래 내역 조회"""
        headers = {"Authorization": f"Bearer {self.access_token}"}
        response = requests.get(
            f"{self.base_url}/v1/bank/accounts/{account_num}/transactions",
            headers=headers,
            params={"from_date": from_date, "to_date": to_date}
        )
        return response.json().get("transactions", [])

    def aggregate_financial_data(self, user_ci: str) -> Dict:
        """사용자 금융 데이터 통합 조회 (AI 분석용)"""
        # 여러 기관의 데이터 수집
        aggregated = {
            "user_ci": user_ci,
            "collected_at": datetime.now().isoformat(),
            "accounts": [],
            "transactions": [],
            "total_assets": 0
        }

        # 실제로는 동의받은 모든 기관에서 데이터 수집
        banks = ["BANK001", "BANK002"]  # 동의받은 기관 코드

        for bank in banks:
            accounts = self.get_account_list(user_ci, bank)
            for account in accounts:
                aggregated["accounts"].append(account)
                aggregated["total_assets"] += account.get("balance", 0)

        return aggregated

# AI 개인화 서비스 예시
def recommend_financial_product(user_data: Dict) -> Dict:
    """마이데이터 기반 AI 금융상품 추천"""
    total_assets = user_data.get("total_assets", 0)
    transactions = user_data.get("transactions", [])

    # 간단한 규칙 기반 추천 (실제로는 ML 모델 사용)
    recommendation = {
        "user_ci": user_data["user_ci"],
        "timestamp": datetime.now().isoformat(),
        "products": [],
        "explanation": ""  # AI Act 투명성 요건: 추천 근거 설명
    }

    if total_assets > 50000000:
        recommendation["products"].append({
            "type": "investment",
            "name": "고액자산 ETF 포트폴리오",
            "reason": "총 자산 5천만원 이상 고객 대상"
        })

    recommendation["explanation"] = (
        f"귀하의 총 자산 {total_assets:,}원과 "
        f"최근 거래 패턴을 분석하여 추천되었습니다."
    )

    return recommendation

# 사용 예시
client = MyDataClient("client_id", "secret", "MYDATA001")
# client.authenticate(auth_code)
# data = client.aggregate_financial_data("user_ci_value")
# recommendation = recommend_financial_product(data)

실무 대화

PM: 마이데이터 기반 AI 추천 서비스를 기획하고 있는데, 규제 이슈가 있나요?

법무팀: 마이데이터 사업자는 수집한 정보를 본인에게만 제공해야 하고, 제3자 제공이나 AI 학습에 별도 활용하려면 추가 동의가 필요합니다.

ML엔지니어: AI 추천 결과에 대한 설명 의무도 있나요?

법무팀: 네, 신용정보법 제36조의2에 따라 자동화평가 결과에 대한 설명요구권이 있어요. 추천 근거를 사용자가 이해할 수 있게 제공해야 합니다.

면접관: 마이데이터와 GDPR 데이터 이동권의 차이점을 설명해주세요.

지원자: 둘 다 개인의 데이터 통제권을 강화하지만 차이가 있습니다. GDPR 데이터 이동권은 범용적이고 개인 간 직접 전송을 강조하는 반면, 한국 마이데이터는 허가받은 사업자(본인신용정보관리업자)를 통한 중개 모델입니다. 또한 마이데이터는 표준 API를 의무화하여 실제 데이터 이동이 원활하도록 설계되었습니다.

시니어: 마이데이터로 수집한 정보를 모델 학습에 직접 사용하는 로직이 있네요. 문제가 될 수 있어요.

주니어: 사용자가 서비스 이용에 동의했는데요?

시니어: 마이데이터 동의는 '조회 및 분석'이지 'AI 학습'이 아닙니다. 모델 학습에 사용하려면 별도의 명시적 동의가 필요해요. 분리해서 처리하세요.

주의사항

더 배우기