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

이 가이드에서는 Cloud Functions에서 액세스가 제어된 신용카드 및 체크카드의 토큰화 서비스 설정 방법을 보여줍니다. 서비스를 설정하기 위해 이 문서에서는 Google Cloud 서비스인 ID 및 액세스 관리(IAM), Cloud Key Management Service(KMS), Datastore 모드의 Firestore를 사용합니다.

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

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

민감한 정보 처리 서비스

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

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

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

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

다음 그림은 토큰화 앱 아키텍처를 보여줍니다.

토큰화 앱 아키텍처

Firestore 모드

Firestore는 Datastore의 다음 주 버전입니다. Firestore는 Datastore와 동일한 API를 사용하고 초당 쓰기 수백만 회까지 확장되는 Datastore 모드로 실행하거나, 다른 API를 사용하고 모바일 및 웹 앱에 적합한 기본 모드로 실행할 수 있습니다.

이 가이드에서는 Datastore 모드의 Firestore를 사용하여 과정을 완료합니다. 이 가이드에서는 기본 모드의 Firestore를 지원하지 않습니다.

Google Cloud 프로젝트에서 이미 Datastore를 사용 설정 한 경우 Datastore를 대신 사용할 수 있습니다. 하지만 이 가이드의 나머지 부분에서는 Datastore 모드에서 Firestore를 사용한다고 가정합니다.

내 앱에서 어떤 Firestore 모드를 사용할지 결정하는 데 도움이 필요하면 기본 모드와 Datastore 모드 중에서 선택 가이드를 참조하세요.

목표

  • 데이터베이스 서비스 및 모드 선택하기
  • 서비스 계정 만들기
  • Cloud KMS 설정하기
  • 스토리지 리전 선택하기
  • 2개의 Cloud 함수 만들기

비용

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

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

시작하기 전에

  1. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  2. 이 가이드에서는 프로젝트를 [YOUR_PROJECT]라고 합니다.
  3. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Cloud Functions and Cloud KMS API를 사용 설정합니다.

    API 사용 설정

  5. Firestore 용 Datastore 모드를 선택합니다.
    Datastore 모드 선택

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

서비스 계정 만들기

  1. Cloud Console에서 IAM 서비스 계정 페이지를 엽니다.

    서비스 계정 페이지로 이동

  2. + 서비스 계정 만들기를 클릭합니다. 대화상자가 나타나면 다음을 수행합니다.

    1. 계정 이름을 Tokenization Service User로 지정합니다.

      기본 ID tokenization-service-user는 항목을 기반으로 생성됩니다.

    2. 만들기를 클릭합니다.

    3. 사전 정의된 역할인 Cloud KMS CryptoKey 암호화/복호화Cloud Datastore 사용자 역할을 부여합니다.

    4. 계속을 클릭합니다.

    5. 키 만들기를 클릭하고 JSON 형식을 선택한 다음 만들기를 클릭합니다.

      만들기를 클릭하면 JSON 파일이 자동으로 다운로드됩니다.

    6. JSON 파일을 안전한 위치로 옮깁니다. 이 파일은 Google Cloud 계정에 강력한 액세스 권한을 부여하므로 주의하여 다뤄야 하며, 이때가 키 집합을 가져올 수 있는 유일한 순간입니다.

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

    tokenization-service-user@[YOUR_PROJECT].iam.gserviceaccount.com

Cloud KMS 설정

  1. Cloud Console에서 암호화 키를 엽니다.

    암호화 키 페이지로 이동

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

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

      키링 만들기

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

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

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

    키 관련 정보 추적

Cloud 함수 만들기

이 가이드에서는 Cloud Shell을 사용하는 것으로 가정합니다. 다른 터미널을 사용하는 경우 최신 버전의 gcloud 명령 줄 도구가 있어야 합니다.

  1. 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 10 런타임에서는 Google Cloud 프로젝트 ID를 명시적으로 정의해야 합니다.

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

    "location":                "global",
    "key_ring":                "tokenization-service-kr",
    "key_name":                "cc-tokenization"
    
  5. 두 Cloud Functions를 모두 KMS 모드로 배포합니다(DLP 모드에 대한 자세한 내용은 README.md 참조).

    gcloud functions deploy tokenize --runtime=nodejs10 --trigger-http --entry-point=kms_crypto_tokenize --memory=256MB --source=.
    gcloud functions deploy detokenize --runtime=nodejs10 --trigger-http --entry-point=kms_crypto_detokenize --memory=256MB --source=.
    

    이 두 명령어를 실행하면 2개의 Cloud 함수가 생성됩니다. 이때 하나는 카드 번호를 토큰으로 전환하고 나머지 하나는 프로세스를 반대로 진행하는 데 사용됩니다. 다양한 진입점이 index.js의 적절한 시작 함수로 실행을 지시합니다.

  6. 각 명령어의 출력에서 httpsTrigger URL을 확인합니다. 이러한 URL은 함수를 호출할 때 필요합니다.

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

    Cloud Functions 콘솔 열기

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

    Cloud Functions가 생성되었는지 확인

인증 토큰 빌드

모든 Cloud 함수를 하나의 서비스 계정 사용자로 실행할 수 있습니다. 지정된 Cloud 함수가 수행할 수 있는 작업을 보다 세밀하게 제어하려면 코드 자체에 규칙을 빌드하면 됩니다. 이전 단계에서 배포한 코드에는 사용자가 만든 특수 서비스 계정(tokenization-service-user@[YOUR_PROJECT].iam.gserviceaccount.com) 대신 생성된 OAuth2 승인 토큰(이 문서에서는 auth_token이라고 함)이 필요합니다.

이 가이드의 범위에 속하지는 않지만 auth_token을 생성하는 방법은 다양합니다. 이 가이드의 나머지 부분에서는 getToken.js라는 개발 및 테스트 도구를 사용할 수 있습니다. GitHub 저장소의 src 폴더에서 getToken.js를 찾을 수 있습니다.

auth_token 생성기를 사용하려면 먼저 서비스 계정 사용자 인증 정보를 제공해야 합니다.

  1. 다운로드한 서비스 계정 사용자 인증 정보가 포함된 JSON 파일을 열고, 전체 내용을 클립보드에 복사합니다. 이때 데이터의 어떠한 부분도 잘리지 않도록 주의하세요.
  2. Cloud Shell에서 인증 토큰 파일을 만들고 엽니다.

    nano ~/.tokenization-service-user.json
  3. JSON 파일의 내용을 붙여넣습니다.

  4. Control+O, Enter, Control+X를 차례로 눌러 저장 후 편집기를 종료합니다.

  5. Cloud Shell 이외의 환경에서 이 프로세스를 실행하려면 GOOGLE_CLOUD_PROJECT 환경 변수를 정의합니다.

    export GOOGLE_CLOUD_PROJECT=[YOUR_PROJECT]
  6. 샘플 auth_token을 생성합니다.

    npm install
    AUTH_TOKEN=$(GOOGLE_APPLICATION_CREDENTIALS=~/.tokenization-service-user.json node src/getToken.js)
    echo $AUTH_TOKEN
    

    이 명령어는 auth_token 문자열을 생성하고 환경 변수 $AUTH_TOKEN에 저장합니다. 편의를 위해 auth_token도 표시됩니다. 여기에서 이 auth_token을 사용하여 토큰화 서비스를 호출할 수 있습니다.

tokenizer 호출

  1. Cloud Functions 콘솔을 엽니다.

    Cloud Functions 콘솔 열기

  2. 함수를 클릭합니다.

  3. 트리거 탭으로 전환한 후 URL이 아직 없으면 해당 URL을 복사합니다. 다음 단계에서는 {CF_URL} 자리에 해당 트리거 URL을 사용합니다.

    Cloud 함수의 URL 복사

  4. 셸에서 트리거 URL을 환경 변수로 저장합니다.

    export TOK_URL="{CF_URL}"
  5. tokenizer에 전달할 샘플 데이터를 몇 개 만듭니다.

    export TOK_CC=4000300020001000
    export TOK_MM=11
    export TOK_YYYY=2028
    export TOK_UID=543210
    
  6. 이전 섹션에서 설명한 대로 auth_token을 생성한 다음 tokenizer를 호출합니다.

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

    이 단계가 문제 없이 완료되면 64자리 영숫자 문자열이 표시됩니다. 이 문자열은 환경 변수 CC_TOK에 저장되어 있습니다. detokenizer를 호출하여 카드 정보를 가져올 수 있습니다.

  7. 토큰화 프로세스를 반대로 진행하려면 우선 토큰화할 때 URL을 가져온 것과 동일한 방식을 사용하여 역토큰화 함수로 URL을 가져옵니다.

  8. 역토큰화를 위해 다음 명령어를 실행합니다. 이때 {CF2_URL}을 트리거 URL로 바꿉니다.

    export DETOK_URL="{CF2_URL}"
    curl -s -X POST "$DETOK_URL" -H "Content-Type:application/json" --data '{"auth_token":"'$AUTH_TOKEN'", "cc_token": "'$CC_TOKEN'"}'
    

    출력은 다음과 같이 표시됩니다.

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

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

데이터 확인

  1. Datastore 콘솔을 엽니다. 이 콘솔은 Datastore 모드의 Firestore도 지원합니다.

    Datastore 콘솔 열기

  2. 어떤 레코드도 표시되지 않으면 종류cc로 설정하고 네임스페이스tokenizer로 설정합니다.

표시된 데이터는 암호화 필드에서 암호화된 결제 카드로 토큰화된 데이터입니다. (다음 그림에는 암호화 필드가 표시되어 있지 않습니다.)

성공적으로 토큰화된 결제 카드(암호화 필드 표시되지 않음)

이 가이드의 확장

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

처음 액세스 토큰을 생성하고 업데이트하는 경우 각 요청에 대해 OAuth 토큰을 생성하면 불필요한 API 호출이 추가되고, 서비스 속도가 저하되어 인증 할당량이 소모될 수 있습니다.

결제 카드 토큰화에 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. Datastore 콘솔을 엽니다.

    Datastore 콘솔 열기

  2. 생성된 모든 레코드를 선택하고 삭제를 클릭합니다.

  3. Cloud Functions 콘솔을 엽니다.

    Cloud Functions 콘솔 열기

  4. 생성된 모든 함수를 선택하고 삭제를 클릭합니다.

  5. IAM 콘솔을 엽니다.

    IAM 콘솔 열기

  6. tokenization-service-user@[YOUR_PROJECT].iam.gserviceaccount.com이라는 서비스 계정을 선택하고 삭제를 클릭합니다.

  7. IAM 암호화 키 페이지에서 키링 tokenization-service-kr을 열고 키 cc-tokenization을 삭제합니다.

  8. Cloud Storage Console에서 staging.[YOUR_PROJECT].appspot.com이라는 버킷을 삭제합니다.

또는 이 가이드용으로 프로젝트를 만들었으면 전체 프로젝트를 삭제해도 됩니다.

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

    리소스 관리로 이동

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

다음 단계