PCI DSS에 해당하는 민감한 카드 소지자 정보 토큰화

Last reviewed 2025-04-28 UTC

이 문서에서는 Cloud Run Functions에서 액세스가 제어된 신용카드 및 체크카드의 토큰화 서비스를 설정하는 방법을 보여줍니다. 서비스 설정을 위해 이 문서의 배포에서는 Identity and Access Management (IAM)Cloud Key Management Service (KMS) 서비스를 사용합니다. Google Cloud

토큰화는 정상적인 자리표시자 값이나 토큰을 신용카드 데이터와 같이 민감한 정보로 치환하는 프로세스입니다. 결제 카드 산업 데이터 보안 표준(PCI DSS)의 3부에 따라 신용카드에 저장된 데이터의 대부분은 민감한 정보로 취급해야 합니다.

특정 상황에서 토큰화된 데이터를 조회하는 수단으로 사용하는 경우를 제외하고 토큰 자체는 의미가 없습니다. 그러나 여전히 토큰에 특정한 사용자 정보가 포함되거나 직접 복호화할 수 없는지 확인해야 합니다. 이렇게 해야 고객의 결제 카드 토큰을 제어할 수 없을 때 아무도 토큰을 사용하여 카드 소지자 데이터에 악영향을 미칠 수 없게 됩니다.

민감한 정보 처리 서비스

카드 소지자 데이터 환경(CDE)을 호스팅할 플랫폼이나 서비스는 다양하게 선택할 수 있습니다. 이 문서에서는 Cloud Run Functions를 사용하는 샘플 배포 과정을 안내하고 프로덕션에 즉시 사용 가능한 솔루션의 다음 단계를 결정하는 데 도움을 줍니다.

Cloud Run Functions는 코드를 호스팅하고 실행하는 서버리스 플랫폼으로 사용자의 개입 없이 자동으로 확장되는 애플리케이션을 신속하게 출시할 수 있는 편리한 환경입니다. PCI DSS 규격의 CDE에서는 승인된 연결에 대한 수신 및 발신 트래픽을 모두 제한해야 한다는 점에 유의하세요. 이러한 세밀한 제어는 현재 Cloud Run Functions에서는 사용할 수 없습니다. 따라서 다른 위치(예: 애플리케이션)에 보완 제어를 구현하거나 다른 플랫폼을 선택해야 합니다. 동일한 토큰화 서비스는 자동 확장되는 관리형 인스턴스 그룹 또는 Kubernetes 클러스터와 같이 컨테이너 방식으로 실행할 수 있습니다. 이렇게 하면 VPC 네트워크를 완전히 제어할 수 있는 권장 프로덕션 환경이 구축됩니다.

Cloud KMS는 Google Cloud의 키 관리 서비스입니다. Cloud KMS는 암호화 키를 호스팅하여 정기적으로 순환하고, 저장된 계정 데이터를 암호화하거나 복호화합니다.

이 문서에서 IAM은 토큰화 서비스에 사용되는 전체 리소스를 확실히 제어하기 위한 용도로 사용됩니다. Cloud KMS에 액세스 권한을 부여하고 tokenizer를 실행하려면 자주 만료되는 토큰이 있는 특수 서비스 계정이 필요합니다.

다음 그림은 이 문서에서 만드는 토큰화 앱 아키텍처를 보여줍니다.

토큰화 앱 아키텍처

목표

  • 서비스 계정 만들기.
  • Cloud KMS 설정하기
  • Cloud Run 함수 2개 만들기
  • 인증 토큰 만들기
  • tokenizer 호출하기

비용

이 문서에서는 비용이 청구될 수 있는 Google Cloud구성요소( )를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용합니다.

신규 Google Cloud 사용자는 무료 체험판을 이용할 수 있습니다.

시작하기 전에

  1. In the Google Cloud console, go to the project selector page.

    Go to project selector

  2. Click Create project.

  3. Name your project. Make a note of your generated project ID.

  4. Edit the other fields as needed.

  5. Click Create.

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Build, Cloud Run functions, and Cloud KMS APIs.

    Enable the APIs

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

서비스 계정 만들기

Cloud Run 함수의 기본 런타임 서비스 계정에는 편집자 역할이 있으므로 여러 Google Cloud 서비스에 대한 광범위한 액세스가 허용됩니다. 이 방법이 함수를 개발하는 가장 빠른 방법이지만 테스트 및 개발에만 기본 서비스 계정을 사용하는 것이 좋습니다. 최소 권한의 원칙에 따라 함수에서 사용할 수 있는 API를 제한하는 서비스 계정을 만듭니다. 서비스 계정을 만들려면 다음을 수행합니다.

  1. Google Cloud 콘솔에서 서비스 계정 페이지로 이동합니다.

    서비스 계정으로 이동

  2. 프로젝트를 선택합니다.

  3. 서비스 계정 만들기를 클릭합니다.

  4. 서비스 계정 이름 필드에 Tokenization Service User를 입력합니다. Google Cloud 콘솔은 이 이름을 기반으로 서비스 계정 ID 필드를 채웁니다.

  5. 선택사항: 서비스 계정 설명 필드에 서비스 계정의 설명을 입력합니다.

  6. 만들고 계속하기를 클릭합니다.

  7. 역할 선택을 클릭한 후 Cloud KMS CryptoKey 암호화/복호화를 선택합니다.

  8. 서비스 계정 만들기를 마치려면 완료를 클릭합니다.

    이제 서비스 계정이 생성되었으며 사용자 이메일 주소는 다음과 같습니다.

    tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com

Cloud KMS 설정하기

  1. Google Cloud 콘솔에서 키 관리를 엽니다.

    암호화 키 페이지로 이동

  2. + 키링 만들기를 클릭합니다. 대화상자가 나타나면 다음을 수행합니다.

    1. 키링의 이름을 tokenization-service-kr로 지정합니다.
    2. 키링 위치에서 전역을 선택합니다. 이 일반적인 옵션은 이 예시 배포 용도로 충분합니다. 하지만 프로덕션 아키텍처를 결정하기 전에 다양한 Cloud KMS 위치 간의 차이점을 이해해야 합니다.
    3. 선택 항목을 다시 확인합니다. 키링을 만든 후에는 삭제하거나 이름을 바꿀 수 없습니다.
    4. 만들기를 클릭합니다.

    시스템에서 키링을 만들며 키 생성 페이지가 나타납니다.

  3. 키 만들기 대화상자에서 다음을 수행합니다.

    1. 키 이름을 cc-tokenization으로 지정합니다.
    2. 용도에서 Symmetric encrypt/decrypt를 선택합니다.
    3. 순환 기간을 원하는 값으로 설정하고 만들기를 클릭합니다.

Cloud Run 함수 만들기

이 문서에서는 Cloud Shell을 사용하는 것으로 가정합니다. 다른 터미널을 사용하는 경우 최신 버전의 Google Cloud CLI가 있어야 합니다.

  1. Google Cloud 콘솔에서 Cloud Shell을 엽니다.

    Cloud Shell로 이동

  2. GitHub 프로젝트 저장소를 클론하여 작업 폴더로 옮깁니다.

    git clone https://github.com/GoogleCloudPlatform/community gcp-community
    cd gcp-community/tutorials/pci-tokenizer/
    

    gcs-cf-tokenizer 폴더에는 만들려는 두 가지 Cloud Run 함수의 소스인 index.js 파일이 포함되어 있습니다. 또한 Cloud Run Functions에 실행할 패키지를 알려주는 package.json도 포함됩니다.

  3. KMS 구성을 적용합니다. 구성 템플릿 파일을 복사하여 열어서 편집합니다.

    cp config/default.json config/local.json
    nano config/local.json
    

    Node.js 런타임에서는 Google Cloud 프로젝트 ID를 명시적으로 정의해야 합니다.

    "project_id":              "YOUR_PROJECT_ID"
  4. KMS 구성을 찾고 이전 섹션에서 만든 KMS 값을 적용합니다.

    "location":                "global",
    "key_ring":                "tokenization-service-kr",
    "key_name":                "cc-tokenization"
    
  5. 토큰화 함수를 배포합니다.

    gcloud functions deploy tokenize --runtime=nodejs18 --trigger-http \
        --entry-point=kms_crypto_tokenize --memory=256MB \
        --service-account=tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com \
        --no-allow-unauthenticated --source=.
    

    이 함수는 신용카드 정보를 토큰으로 변환합니다.

  6. gcloud functions deploy 명령어의 출력에서 httpsTrigger 아래의 URL 값을 찾습니다. URL 값을 TOK_URL 환경 변수에 저장합니다.

    TOK_URL="TOK_URL"

    TOK_URL 환경 변수를 사용하여 tokenize 함수를 호출합니다.

  7. KMS 모드로 detokenize 함수를 배포합니다.

    gcloud functions deploy detokenize --runtime=nodejs18 --trigger-http \
        --entry-point=kms_crypto_detokenize --memory=256MB \
        --service-account=tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com \
        --no-allow-unauthenticated --source=.
    

    이 함수는 토큰화 프로세스를 되돌립니다.

  8. gcloud functions deploy 명령어의 출력에서 httpsTrigger 아래의 URL 값을 찾습니다. URL 값을 DETOK_URL 환경 변수에 저장합니다.

    DETOK_URL="DETOK_URL"

    DETOK_URL 환경 변수를 사용하여 detokenize 함수를 호출합니다.

    카드 번호를 토큰으로 전환하는 함수와 프로세스를 반대로 진행하는 함수 등 두 개의 별도 Cloud Run 함수를 만들었습니다. 다양한 진입점이 index.js 파일의 적절한 시작 함수로 실행을 지시합니다.

  9. 함수가 배포되면 Cloud Run Functions 콘솔을 엽니다.

    Cloud Run Functions 콘솔 열기

  10. 함수가 생성되었는지 확인합니다. 아무 문제가 없으면 두 함수 옆에 각각 체크표시가 나타납니다.

인증 토큰 만들기

gcloud functions deploy 명령어의 no-allow-unauthenticated 옵션은 함수를 호출하는 호출자가 호출자의 ID를 어설션하기 위해 인증 토큰을 제시해야 함을 의미합니다. 호출자에게는 cloudfunctions.functions.invoke 권한이 있어야 합니다. 다음 사전 정의된 역할에는 이 권한이 있습니다. Cloud Functions 호출자, Cloud Functions 관리자, Cloud Functions 개발자

  • 인증 토큰을 만듭니다.

    AUTH_TOKEN=$(gcloud auth print-identity-token)
    echo $AUTH_TOKEN
    

이 명령어는 인증 토큰 문자열을 생성하고 환경 변수 $AUTH_TOKEN에 저장한 후 토큰을 표시합니다. 나중에 토큰으로 배포한 Cloud Run 함수를 호출합니다.

tokenizer 호출

  1. tokenizer에 전달할 샘플 데이터를 몇 개 만듭니다.

    export TOK_CC=4000300020001000
    export TOK_MM=11
    export TOK_YYYY=2028
    export TOK_UID=543210
    
  2. 이전 섹션의 설명대로 인증 토큰을 생성하고 tokenizer를 호출합니다.

    CC_TOKEN=$(curl -s \
    -X POST "$TOK_URL" \
    -H "Content-Type:application/json" \
    -H "Authorization: Bearer $AUTH_TOKEN" \
    --data '{"cc": "'$TOK_CC'", "mm": "'$TOK_MM'", "yyyy": "'$TOK_YYYY'", "user_id": "'$TOK_UID'"}' \
    )
    echo $CC_TOKEN
    

    신용카드 데이터를 나타내는 토큰화 문자열이 표시됩니다. 이 문자열은 환경 변수 CC_TOK에 저장되어 있습니다. detokenizer를 호출하여 카드 정보를 가져올 수 있습니다.

  3. 다음 명령어를 사용하여 토큰화를 되돌립니다.

    DETOK_DATA=$(curl -s \
    -X POST "$DETOK_URL" \
    -H  "Content-Type:application/json" \
    -H "Authorization: Bearer $AUTH_TOKEN" \
    --data '{"user_id": "'$TOK_UID'", "token": "'$CC_TOKEN'"}' \
    )
    echo -e "$DETOK_DATA\n"
    

    출력은 다음과 같습니다.

    {"cc":"4000300020001000","mm":"11","yyyy":"2028","userid":"543210"}
    

    이 데이터는 tokenizer로 처음 보내 복호화한 후 앱에서 가져온 데이터입니다.

이 예시를 확장해 줘

GitHub의 샘플 코드로 시작하는 것도 좋지만 프로덕션으로 전환하기 전에는 다양한 측면을 고려해야 합니다.

결제 카드 토큰화에 Cloud Run 함수를 사용하려면 QSA(Qualified Security Assessor) 또는 SAQ(Self-Assessment Questionnaire)를 충족하도록 추가 작업을 해야 합니다. 특히 PCI DSS 섹션 1.2 및 1.3에 따라 수신 및 발신 트래픽을 확실히 제어해야 합니다. Cloud Run 함수 및 App Engine은 양방향의 구성 가능한 방화벽을 제공하지 않으므로 Compute Engine 또는 Google Kubernetes Engine에 보완 제어를 구축하거나 토큰화 서비스를 배포해야 합니다. 컨테이너화를 살펴보려면 GitHub 코드가 Docker와 호환되며 지원 문서가 포함되어 있어야 합니다.

이 샘플 코드는 배포 시 npm(Node.js 패키지 관리자) 종속 항목도 가져옵니다. 프로덕션 환경에서는 검증된 특정 버전에 항상 종속 항목을 고정해야 합니다. 그런 다음 이러한 버전을 앱 자체에 번들로 묶거나 신뢰할 수 있는 비공개 위치에서 제공해야 합니다. 두 방법 모두 공용 npm 저장소 중단이나 안전했던 패키지를 감염시키는 공급망 공격으로 인해 발생하는 다운타임을 방지하는 데 도움을 줍니다. 전체 앱을 사전 빌드하고 번들로 묶으면 배포 시간은 대개 줄어들기 때문에 출시 시간이 단축되고 확장이 원활하게 수행되는 효과를 얻을 수 있습니다.

삭제

이 예시 배포에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하면 됩니다.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

다음 단계