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

Last reviewed 2023-05-05 UTC

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

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

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

민감한 정보 처리 서비스

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

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

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

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

다음은 이 튜토리얼에서 만드는 토큰화 앱 아키텍처를 보여주는 그림입니다.

토큰화 앱 아키텍처

목표

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

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud Console에서 프로젝트 선택기 페이지로 이동합니다.

    프로젝트 선택기로 이동

  2. Google Cloud 프로젝트 만들기를 시작하려면 프로젝트 만들기를 클릭합니다.

  3. 프로젝트 이름을 지정합니다. 생성된 프로젝트 ID를 기록합니다.

  4. 필요에 따라 다른 필드를 수정합니다.

  5. 프로젝트를 만들려면 만들기를 클릭합니다.

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. API Cloud Build, Cloud Functions, and Cloud KMS 사용 설정

    API 사용 설정

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

서비스 계정 만들기

Cloud Functions의 기본 런타임 서비스 계정에 편집자 역할이 있으므로 여러 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 Functions 만들기

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

  1. Google Cloud Console에서 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 Functions의 소스인 index.js 파일이 포함되어 있습니다. 또한 Cloud 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 모드로 역토큰화 함수를 배포합니다.

    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 환경 변수를 사용하여 역토큰화 함수를 호출합니다.

    두 개의 Cloud Functions를 만들었습니다. 하나는 카드 번호를 토큰으로 전환하고 다른 하나는 프로세스를 반대로 수행하는 데 사용됩니다. 다양한 진입점이 index.js 파일의 적절한 시작 함수로 실행을 지시합니다.

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

    Cloud Functions 콘솔 열기

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

    Cloud Functions가 생성되었는지 확인

인증 토큰 만들기

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 Functions를 호출합니다.

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

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

삭제

이 튜토리얼에서 사용한 개별 리소스를 삭제하려면 프로젝트를 삭제하면 됩니다.

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계