로컬에서 웹 엔드 투 엔드의 B&A 테스트

1. 소개

입찰 서비스 (B&A)는 구매자와 판매자가 Protected Audience 입찰을 진행하는 데 필요한 4가지 서비스로 구성됩니다.

구매자 스택:

  • 구매자 프런트엔드 서비스
  • 입찰 서비스

판매자 스택:

  • 판매자 프런트엔드 서비스
  • 입찰 서비스

이 Codelab에서는 로컬 환경에서 엔드 투 엔드 설정을 설정하고 테스트하는 방법을 안내합니다. 이 둘러보기는 초기 서비스 빌드 시간을 제외하고 약 1시간 정도 소요될 것으로 예상됩니다.

구매 측 코드 또는 판매 측 코드만 작업할 수도 있지만 로컬 환경에서 엔드 투 엔드 흐름을 설정하여 구매자 스택과 판매자 스택이 서로 작동하는 방식을 더 잘 이해하는 것이 좋습니다. 두 스택을 모두 설정하면 나중에 다른 당사자의 구매자 또는 판매자 스택과 통합할 때 더 확실하게 할 수 있습니다. 로컬에서 서비스를 테스트하면 개발 비용도 절약됩니다.

이 Codelab에서는 B&A 로컬 테스트 앱을 둘러보기 도우미로 사용합니다.

호환되는 로컬 테스트 앱은 입찰에서 사용되는 다양한 구매자 및 판매자 리소스를 호스팅합니다. 또한 앱은 http://localhost:3000에서 다양한 입찰 구성을 시뮬레이션할 수 있는 UI를 제공합니다.

2. 환경 설정

2.1 Linux 머신 준비

로컬 Linux 머신을 사용하거나 원하는 클라우드 제공업체의 Linux VM을 프로비저닝합니다. 빌드 시간을 개선하려면 최소 16개 이상의 코어를 사용하는 것이 좋으며 32개 이상의 코어를 사용하는 것이 좋습니다.

이 머신의 http://localhost:3000에서 HTML 페이지를 로드합니다. VM에서 GUI를 제공하지 않는 경우 로컬 머신에서 VM에 연결할 수 있도록 포트 3000에 액세스할 수 있는지 확인합니다.

2.2 Docker 설치

Docker를 사용하여 서비스와 로컬 테스트 애플리케이션을 실행합니다.

편의 스크립트를 사용하여 테스트 환경에 Docker를 설치합니다.

# Install Docker
> curl -fsSL https://get.docker.com -o get-docker.sh
> sudo sh get-docker.sh

# Set up sudo-less Docker
> sudo groupadd docker
> sudo usermod -aG docker $USER
> newgrp docker

# Test
> docker run hello-world

경고: sudo가 없는 설정에서는 Docker 그룹이 사용자에게 루트 수준 권한을 부여합니다. sudo가 없는 Docker 가이드를 읽고 자세한 내용을 알아보세요.

2.3 호환 로컬 테스트 앱 시작

호환 앱은 예시 입찰/점수 스크립트, 예시 K/V BYOS 엔드포인트와 같은 리소스를 제공합니다. 리소스를 서비스에 로드할 수 있도록 B&A 서비스를 실행하기 전에 앱을 시작해야 합니다.

로컬 테스트 앱 저장소를 가져옵니다.

git clone https://github.com/privacysandbox/bidding-auction-local-testing-app.git

저장소의 루트에서 설정 스크립트를 실행합니다.

./setup

설정 스크립트는 ba-dev Docker 네트워크를 만들고, SSL 인증서를 생성하고, 테스트 앱 이미지를 빌드합니다.

빌드가 완료되면 시작 스크립트를 실행합니다.

./start

3. 로컬에서 B&A 빌드 및 실행

3.1 B&A 서비스 가져오기

동일한 머신에서 두 세트의 B&A 서비스를 실행할 예정이므로 저장소를 두 개의 서로 다른 폴더로 가져옵니다.

세트 A:

B&A 저장소를 가져옵니다.

git clone https://github.com/privacysandbox/bidding-auction-servers.git bidding-auction-servers-set-a

세트 B

B&A 저장소를 가져옵니다.

git clone https://github.com/privacysandbox/bidding-auction-servers.git bidding-auction-servers-set-b
`

3.2 서비스 빌드

각 B&A 폴더의 루트 폴더에서 다음 명령어를 실행하여 4가지 서비스를 모두 빌드합니다.

production/packaging/build_and_test_all_in_docker \
  --service-path bidding_service \
  --service-path auction_service \
  --service-path buyer_frontend_service \
  --service-path seller_frontend_service \
  --platform gcp \
  --instance local \
  --no-precommit \
  --no-tests \
  --build-flavor non_prod \
  --gcp-skip-image-upload

위 명령어는 4가지 서비스의 Google Cloud Platform (gcp)용 개발 빌드 (non_prod)의 local 인스턴스를 빌드합니다. 필요한 경우 --platform 플래그를 원하는 클라우드 제공업체로 업데이트합니다. 빌드 플래그에 관해 자세히 알아보려면 build_and_test_all_docker 파일을 확인하세요.

64코어 머신을 사용하는 경우 초기 빌드에 2시간이 걸릴 수 있으며 빌드 시간은 코어 수를 기준으로 선형적으로 확장됩니다. 32코어 머신의 경우 4시간이 걸릴 수 있습니다. 16코어 머신을 사용하는 경우 8시간이 걸릴 수 있습니다.

후속 빌드에서는 캐시를 사용하며 각 빌드에는 약 5~20분이 소요됩니다.

관련 xkcd 만화:

사무실에서 게으름을 피우는 두 프로그래머를 보여주고, 이로 인해 관리자가 일을 시작하라고 말하고, 직원이 코드가 컴파일되고 있다고 말하고, 관리자가 괜찮다고 말하며, 이 만화의 저자는 게으름을 피우는 데 가장 합리적인 변명이라고 생각함

(이 Codelab을 작성하는 동안 xkcd의 랜들 문로우를 만났고 여기에 이 만화를 추가했다고 말했습니다)

3.3 서비스 실행

테스트에서는 8개의 서비스 (스택당 4개 서비스)를 실행합니다. 각 명령어는 로컬 테스트 앱에서 제공하는 리소스를 사용하도록 설정됩니다. tmux와 같은 창 관리자를 사용하는 것이 좋습니다.

터미널 창을 8개 이상 추가로 열고 각 세션에서 다음 명령어를 실행합니다.

입찰 및 점수 스크립트는 앱에서 제공되므로 로컬 테스트 앱 서버는 이미 별도의 프로세스에서 실행 중이어야 합니다.

3.3.1 Set A 명령어

서비스

명령어

DSP-X 입찰 서비스

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.101 --network=ba-dev" \

BIDDING_JS_URL=https://192.168.84.100:5003/generate-bid.js \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_bidding

DSP-X BFE 서비스

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.102 --network=ba-dev" \

BUYER_KV_SERVER_ADDR=https://192.168.84.100:5003/kv \

BIDDING_SERVER_ADDR=192.168.84.101:50057 \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_bfe

SSP-BA 입찰 서비스

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.103 --network=ba-dev" \

AUCTION_JS_URL="https://192.168.84.100:6002/score-ad.js" \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_auction

SSP-BA SFE 서비스

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.104 --network=ba-dev" \

SELLER_ORIGIN_DOMAIN="https://localhost:6002" \

AUCTION_SERVER_ADDR="192.168.84.103:50061" \

KEY_VALUE_SIGNALS_ADDR="https://192.168.84.100:6002/kv" \

BUYER_SERVER_ADDRS_JSON='{"https://localhost:5003":{"url":"192.168.84.102:50051","cloudPlatform":"LOCAL"},"https://localhost:5004":{"url":"192.168.84.202:50051","cloudPlatform":"LOCAL"}}' \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_sfe

3.3.2 세트 B 명령어

서비스

명령어

DSP-X 입찰 서비스

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.201 --network=ba-dev" \

BIDDING_JS_URL=https://192.168.84.100:5004/generate-bid.js \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_bidding

DSP-X BFE 서비스

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.202 --network=ba-dev" \

BUYER_KV_SERVER_ADDR=https://192.168.84.100:5004/kv \

BIDDING_SERVER_ADDR=192.168.84.201:50057 \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_bfe

SSP-BA 입찰 서비스

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.203 --network=ba-dev" \

AUCTION_JS_URL="https://192.168.84.100:6003/score-ad.js" \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_auction

SSP-BA SFE 서비스

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.204 --network=ba-dev" \

SELLER_ORIGIN_DOMAIN="https://localhost:6003" \

AUCTION_SERVER_ADDR="192.168.84.203:50061" \

KEY_VALUE_SIGNALS_ADDR="https://192.168.84.100:6003/kv" \

BUYER_SERVER_ADDRS_JSON='{"https://localhost:5003":{"url":"192.168.84.102:50051","cloudPlatform":"LOCAL"},"https://localhost:5004":{"url":"192.168.84.202:50051","cloudPlatform":"LOCAL"}}' \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_sfe

3.3.2 로컬 시작 스크립트의 환경 변수

다음 환경 변수를 사용하여 시작 동작을 제어할 수 있습니다.

환경 변수

가용성

설명

DOCKER_RUN_ARGS_STRING

모든 서비스

docker 명령어에 설정할 플래그

SKIP_TLS_VERIFICATION

모든 서비스

로컬 머신에서 테스트하는 경우 curl의 SSL 피어 인증 확인에 실패하는 자체 서명 인증서를 사용해야 할 수 있습니다. 이 플래그는 SSL 호스트 이름 확인과 함께 피어 인증을 사용 중지합니다.

기본값은 false입니다.

PS_VERBOSITY

모든 서비스

서비스 로그의 수준입니다. 수준이 높을수록 더 많은 로그가 제공됩니다. 0이 가장 낮고 10이 가장 높습니다. 기본값은 10입니다.

BIDDING_PORT

입찰 서비스

입찰 서비스의 포트입니다. 기본값은 50057입니다.

BIDDING_JS_URL

입찰 서비스

입찰 로직의 URL

EGRESS_SCHEMA_URL

입찰 서비스

모델 학습을 위한 데이터 이그레스

INFERENCE_ARGS

입찰 서비스

입찰 추론의 인수

BFE_PORT

BFE 서비스

BFE 서비스의 포트입니다. 기본값은 50051입니다.

BUYER_KV_SERVER_ADDR

BFE 서비스

구매자의 BYOS K/V 주소

BUYER_TKV_V2_SERVER_ADDR

BFE 서비스

구매자의 TEE K/V 주소

BIDDING_SERVER_ADDR

BFE 서비스

구매자의 입찰 서비스 주소

AUCTION_PORT

입찰 서비스

입찰 서비스의 포트입니다. 기본값은 50061입니다.

AUCTION_JS_URL

입찰 서비스

점수 로직의 URL

BUYER_REPORT_WIN_URL

입찰 서비스

구매자의 낙찰 보고 URL

BUYER_REPORT_WIN_SCRIPT

입찰 서비스

구매자의 낙찰 보고 스크립트

BUYER_PAS_REPORT_WIN_SCRIPT

입찰 서비스

PAS용 구매자 낙찰 보고 스크립트

SFE_PORT

SFE 서비스

SFE 서비스의 포트입니다. 기본값은 50053입니다.

AUCTION_SERVER_ADDR

SFE 서비스

판매자의 입찰 서비스 주소

KEY_VALUE_SIGNALS_ADDR

SFE 서비스

판매자의 BYOS K/V 주소

TRUSTED_KEY_VALUE_V2_SIGNALS_ADDR

SFE 서비스

판매자의 TEE K/V 주소

SELLER_ORIGIN_DOMAIN

SFE 서비스

판매자 출처

BUYER_SERVER_ADDRS_JSON

SFE 서비스

구매자의 BFE 주소

4. 명령줄에서 보안 호출로 테스트

4.1 SFE 테스트

B&A 서비스 패키지에 포함된 Secure Invoke 도구를 사용하여 명령줄에서 서비스를 직접 호출할 수도 있습니다.

4.1.2 SFE SelectAd 페이로드

다음 JSON 요청은 SSP-BA의 단일 판매자 입찰 설정으로 채워졌습니다.

{
  "auction_config": {
    "seller": "https://localhost:6002",
    "auction_signals": "{\"testKey\":\"someValue\"}",
    "seller_signals": "{\"testKey\":\"someValue\"}",
    "buyer_list": [
      "https://localhost:5003",
      "https://localhost:5004"
    ],
    "per_buyer_config": {
      "https://localhost:5003": { "buyer_signals": "{\"testKey\":\"someValue\"}" },
      "https://localhost:5004": { "buyer_signals": "{\"testKey\":\"someValue\"}" }
    }
  },
  "raw_protected_audience_input": {
    "publisher_name": "http://localhost:4001",
    "generation_id": "1210718540",
    "enable_debug_reporting": true,
    "raw_buyer_input": {
      "https://localhost:5003": {
        "interest_groups": [
          {
            "name": "dsp-x-demo",
            "ad_render_ids": ["1234"],
            "bidding_signals_keys": ["demo-key"],
            "browser_signals": { "bid_count": "1", "join_count": "1", "prev_wins": "[]" },
            "user_bidding_signals": "[1, 2, 3]"
          }
        ]
      },
      "https://localhost:5004": {
        "interest_groups": [
          {
            "name": "dsp-x-demo",
            "ad_render_ids": ["1234"],
            "bidding_signals_keys": ["demo-key"],
            "browser_signals": { "bid_count": "1", "join_count": "1", "prev_wins": "[]" },
            "user_bidding_signals": "[1, 2, 3]"
          }
        ]
      }
    }
  }
}

세트 A의 B&A 서비스 저장소 루트 폴더에 파일을 sfe-test.json로 저장합니다. B&A 빌드 스크립트는 저장소의 루트 폴더에 있는 파일을 Docker 이미지의 /src/workspace 폴더에 복사합니다.

4.1.2 보안 호출을 사용하여 SFE 호출

B&A 서비스 저장소의 루트 폴더에서 다음 명령어를 실행합니다.

DOCKER_NETWORK=ba-dev ./builders/tools/bazel-debian run //tools/secure_invoke:invoke \
  -- \
  -target_service=sfe \
  -input_file=/src/workspace/sfe-test.json \
  -host_addr=192.168.84.104:50053 \
  -client_ip=192.168.84.100 \
  -insecure=true

B&A 스택이 올바르게 설정되면 다음과 같은 성공 응답이 표시됩니다.

{"adRenderUrl":"https://localhost:5004/ad.html","interestGroupName":"dsp-x-demo","interestGroupOwner":"https://localhost:5004","score":39,"bid":39,"biddingGroups":{"https://localhost:5003":{"index":[0]},"https://localhost:5004":{"index":[0]}}}

4.2 BFE 테스트

4.2.1 BFE GetBids 요청

{
  "buyer_input": {
    "interest_groups": {
      "name": "dsp-x-demo",
      "ad_render_ids": ["1234"],
      "bidding_signals_keys": ["demo-key"],
      "browser_signals": { "bid_count": "1", "join_count": "1", "prev_wins": "[]" }
    }
  },
  "auction_signals": "{\"testKey\":\"someValue\"}",
  "buyer_signals": "{\"testKey\":\"someValue\"}",
  "seller": "https://localhost:6002",
  "publisher_name": "http://localhost:4001",
  "enable_debug_reporting": true,
  "client_type": "CLIENT_TYPE_BROWSER"
}

B&A 서비스 저장소의 루트 폴더에 파일을 bfe-test.json로 저장합니다.

4.2.2 보안 호출을 사용하여 BFE 호출

B&A 서비스 저장소의 루트 폴더에서 다음 명령어를 실행합니다.

DOCKER_NETWORK=ba-dev ./builders/tools/bazel-debian run //tools/secure_invoke:invoke \
  -- \
  -target_service=bfe \
  -input_file="/src/workspace/bfe-test.json" \
  -host_addr="192.168.84.102:50051" \
  -client_ip=192.168.84.100 \
  -insecure=true

B&A 스택이 올바르게 설정되면 BFE는 다음 응답을 반환합니다.

{"bids":[{"bid":6,"render":"https://localhost:5003/ad.html","interestGroupName":"dsp-x-demo"}],"updateInterestGroupList":{}}

4.3 SFE 로그 확인

터미널로 이동하여 SFE 로그를 확인합니다. 출력에서 주목할 만한 로그를 살펴보겠습니다.

4.3.1 SelectAd 요청의 암호화된 페이로드

이 SFE 로그 출력에서 navigator.getInterestGroupAdAuctionData() 호출의 암호화된 페이로드를 확인할 수 있습니다. 이 페이로드는 브라우저에서 생성되고 태그에서 SAS로 전송된 후 SAS에서 SFE로 전달합니다.

I1210 21:20:47.266673      37 select_ad_reactor.cc:228] Protected auction ciphertext: AEAAIAABAAKg3OQSSLEBMR1MmJiwfOT8uef41iE+DQIvKUowsQvVcGbWZ+r17ff2r/iTbEnwqLPtpAxSTy77mi+cVV5cKjkKb4piaZnKiCDIMCyEvrQUD4+BG+HgrbUFhqiWPmQhNThvInMaHuYrXG7xushbRtvSPsVzEl6iBZcLZzD7W3CHMFK7bnJ+ufu52W6B7/8dOQ1gZW6SpwXMGNcrurTGoucbwbZRIPqCcbZk76J1gB69wrDYRo1wQ6jmBleLM36nulxbEj/sHhpQIgr895aKqEGQ3Fy+/HHPTO+zHphcX44YeF6mZ/I+WxZTDxCi1x27nI4yvzC8vI4a/giJN5XUlJZGb/fMrj3/Qly+gwJ8lbxdX+4GWTooDoS4MTtiBpJqh9wkIQ5XwfO54p8Kv6j/tk+51hOfVkOdtGwX0LvVrWT9PiJOJHa23nZ1fLg/22mTe05xdbR3WVeA+xiO9YwF4ozyCYDRUkDyWB/3k9RuaaT9H5S1szVpuOuD2nYSRpT9svmpfG4kipiS6BTPZPX2whDlukpuuoFgdiDtH6cFShNhZ5C47R0ayAvaZ1QSpOZMWfA6pdl4nhvNLpOKesKY/KFDEBzpUXRDsQWsfvmdqFl1mCeX9rOrEc9rodYVLXXhM8GPycehHmvqkccTBW6kipOQlmnSdIYaFmtWSFpUrzxajGkct3mZdTjVjOf...

4.3.2 복호화된 페이로드

이 출력에서 navigator.getInterestGroupAdAuctionData() 호출의 복호화된 페이로드를 확인할 수 있습니다.

I1210 21:20:47.267590      37 select_ad_reactor.cc:347]  (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Decoded BuyerInput:
https://localhost:5003 : {interest_groups { name: "dsp-x-demo" bidding_signals_keys: "demo-key" browser_signals { join_count: 1 recency: 7 prev_wins: "[]" } }}

4.3.3 BFE에 대한 GetBids 요청

GetBids 요청이 SFE에서 BFE로 전송됩니다.

I1210 21:20:47.267710      37 select_ad_reactor.cc:751]  (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Getting bid from a BFE
I1210 21:20:47.267729      37 buyer_frontend_async_client.cc:52] Raw request:
buyer_input {
  interest_groups {
    name: "dsp-x-demo"
    bidding_signals_keys: "demo-key"
    browser_signals {
      join_count: 1
      recency: 7
      prev_wins: "[]"
    }
  }
}
auction_signals: "{\"testKey\":\"someValue\"}"
buyer_signals: "{\"testKey\": \"someValue\"}"
seller: "https://localhost:6002"
publisher_name: "localhost"
enable_debug_reporting: true
log_context {
  generation_id: "c2824bfc-d515-4a1a-9de9-7660ad963252"
}
client_type: CLIENT_TYPE_BROWSER

4.3.4 BFE의 GetBids 응답

BFE는 입찰가와 함께 응답합니다.

I1210 21:20:47.282549      41 select_ad_reactor.cc:856]  (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Received response from a BFE ...
I1210 21:20:47.282552      41 select_ad_reactor.cc:859]  (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252)
GetBidsResponse:
bids {
  bid: 9
  render: "https://localhost:5003/ad.html"
  interest_group_name: "dsp-x-demo"
}
update_interest_group_list {
}

4.3.5 입찰 서비스에 대한 ScoreAds 요청

입찰이 수신되면 SFE에서 각 입찰에 대해 입찰 서비스에 ScoreAds를 호출합니다.

I1210 21:20:47.287898      18 select_ad_reactor.cc:1280]  (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) ScoreAdsRawRequest:
ad_bids {
  bid: 9
  render: "https://localhost:5003/ad.html"
  interest_group_name: "dsp-x-demo"
  interest_group_owner: "https://localhost:5003"
  join_count: 1
  k_anon_status: true
}
seller_signals: "{\"testKey\":\"someValue\"}"
auction_signals: "{\"testKey\":\"someValue\"}"
scoring_signals: "{\"renderUrls\":{\"https://localhost:5003/ad.html\":[1,2,3],\"https://localhost:5004/ad.html\":[1,2,3]}}"
publisher_hostname: "localhost"
enable_debug_reporting: true
log_context {
  generation_id: "c2824bfc-d515-4a1a-9de9-7660ad963252"
}
per_buyer_signals {
  key: "https://localhost:5003"
  value: "{\"testKey\": \"someValue\"}"
}
per_buyer_signals {
  key: "https://localhost:5004"
  value: "{\"testKey\": \"someValue\"}"
}
seller: "https://localhost:6002"

4.3.6 입찰 서비스의 ScoreAds 응답

판매자의 입찰 서비스가 선호도 점수로 응답합니다.

I1210 21:20:47.298029      33 default_async_grpc_client.h:134] Decrypting the response ...
I1210 21:20:47.298100      33 default_async_grpc_client.h:152] Decryption/decoding of response succeeded: ad_score {
  desirability: 9
  render: "https://localhost:5003/ad.html"
  interest_group_name: "dsp-x-demo"
  buyer_bid: 9
  interest_group_owner: "https://localhost:5003"
  win_reporting_urls {
    top_level_seller_reporting_urls {
    }
  }
  ad_type: AD_TYPE_PROTECTED_AUDIENCE_AD
}

4.3.7 SFE의 SelectAd 응답

SFE의 SelectAd 응답이 암호화되어 SAS로 전송됩니다.

I1210 21:20:47.298428      33 select_ad_reactor.cc:1413]  (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Encrypted SelectAdResponse:
auction_result_ciphertext: "\023\233\252\321\000\331M\327\216\201S\332kl?\322\255\247\312\375h\007W\367\016\366FR\364\275\377\326\027h\204\203\265\t\271-\333\266\tH\342\033F\001k\211C\026V\013\271\255(\236\273\353\260\275\007\346\027\340?\005|\235S\244\265\2563U\246\322\177%\200/\3175\034 \020\024\362\345\3263\356F.s\261\005\231\262Z\000\330x\0230\335>\"\217\254\010\254\330>\206\007\274\235\037`\370W\032\207\356\367\206\026\341.i\"$\370\367\2554i\247\354\304e\306\2466S\337\321w\327+!\316\035:\002\231\246\362\366qm\211\000\013\343\345\224{\365py\361\374\316\202\217-\244\302\331\216D\025W#.\304nH\235\315\311<#\342\344\324\257\354\2441\251\312\320\226\342\021\377>3`\347/\350\254h\306\273\023\365\340@\321\2412\254\323\213\0137,\013n\220|\211\323/\030)\314\263\223\355>\254\312aa`!\375\335\023Z\234p\206\037\001\355\261{$\025+\341\275\327Ny\342\342\264=\376\2138\224\026\2058\251\020\202\245*46\023\307)K\342\364k<\2104r\247\034\216}\034\001\374\215\363\210\026\275\371S>\031;f.b\260\363\257.\255\023I\341A\237*_T\355\262\005\344L\336D%\327\267@\302$\300\340\203c\350|\337>C\275c\260\202o\315xp\260\257\241\305U\nK\033\274L6\025\350\373a:\253\212&>p\210\215\017&^\327\005_\037\020\212\362\351\341\231@g\372\0037\275b:)\207\303d\243?\261O\266\343\214\200\004\247\372\022S\326\200\037\330\252r\257+e\273[\231\202\3625{\330\213\240\370\245\\\214\350/\313\ty/\004\313\0304k\223\354\374\305\233\264\224K\344\241\251\322?\323q6\314D\027\200\203\035]\023O\306\230?\203\237:\254\305\265\332\330\2641l\322\020\022\330O-\242\207>Q\364_{F\235\353tk\207\035\205\005\221\373\207\0143\035\014\322\240H\220\347%\262f\347\017\352\273\265\231\014\204\r\312\254z\000\340&\354\222\323\245\356\217(i\246"

5. 브라우저에서 로컬 테스트 앱으로 테스트

5.1 Chrome 열기

명령줄에서 Chrome 시작에 관한 Chromium 도움말을 읽고 다음 플래그를 사용하여 Chrome을 시작합니다.

google-chrome --enable-privacy-sandbox-ads-apis --disable-features=EnforcePrivacySandboxAttestations,FledgeEnforceKAnonymity --enable-features=FledgeBiddingAndAuctionServerAPI,FledgeBiddingAndAuctionServer:FledgeBiddingAndAuctionKeyURL/https%3A%2F%2Fstorage.googleapis.com%2Fba-test-buyer%2Fcoordinator-test-key.json 

이 플래그는 https://storage.googleapis.com/ba-test-buyer/coordinator-test-key.json에 호스팅된 모의 코디네이터 키를 로드하도록 설정됩니다.

중요: B&A 플래그를 사용하여 명령줄에서 Chrome을 열기 전에 모든 Chrome 인스턴스를 완전히 종료했는지 확인하세요. 모든 Chrome 프로세스를 종료하려면 명령줄에서 ps aux | grep -ie chrome/chrome | awk '{print $2}' | xargs kill -9를 실행해 보세요.

5.2 로컬 테스트 앱 UI 방문

앱 UI는 플래그를 사용하여 연 Chrome 브라우저 인스턴스의 http://localhost:3000에서 확인할 수 있습니다. 호스트 이름이 다른 VM을 사용하는 경우 방문하는 정확한 주소가 다를 수 있습니다.

브라우저에서 방문 중인 로컬 테스트 앱의 스크린샷

앱의 상단 행에 있는 'Controls'(제어) 패널에는 다양한 입찰 구성을 시뮬레이션하는 버튼이 포함되어 있습니다. 나머지 두 패널에는 광고주 사이트와 게시자 사이트의 iframe이 포함되어 있습니다.

광고주 페이지 iframe에서 'DSP 태그 로드' 버튼을 클릭하면 각 DSP의 스크립트가 페이지에 추가됩니다. 이러한 스크립트는 사용자를 관심분야 그룹에 추가합니다. Chrome DevTools를 열고 '애플리케이션 / 저장소 / 관심분야 그룹'으로 이동하여 DSP 태그로 조인된 관심분야 그룹을 살펴봅니다.

Chrome DevTools의 관심분야 그룹 스크린샷

그런 다음 '컨트롤' 패널의 버튼을 클릭하여 다양한 입찰 유형을 시뮬레이션합니다.

B&A의 브라우저에서 렌더링된 광고

B&A 서비스와 로컬 테스트 앱이 올바르게 설정된 경우 위의 광고가 '게시자 사이트 iframe' 패널에 렌더링됩니다.

5.3 로컬 테스트 앱 입찰 구성

호환 로컬 테스트 앱에서는 다음 참여자가 포트 번호로 구분되어 호스팅됩니다 (다른 포트는 교차 출처로 간주됨).

참여자

설명

포트

광고주

페이지에 DSP 태그 로드

4001

게시자

페이지에 SSP 태그 로드

4002

DSP-A

기기 내 구매자

5001

DSP-B

기기 내 구매자

5002

DSP-X

B&A 구매자

5003

DSP-Y

B&A 구매자

5004

SSP-TOP

최상위 판매자

6001

SSP-OD

기기 내 판매자만

6002

SSP-BA

B&A 전용 판매자

6003

SSP-MIX

혼합 모드 판매자

6004

DSP는 4가지가 있습니다.

  • DSP-ADSP-B가 기기 내 입찰에 참여합니다.
  • DSP-XDSP-Y가 입찰에 참여함

SSP는 4개이며 각 판매자는 서로 다른 입찰 구성을 실행합니다.

  • SSP-OD는 기기 내 전용 입찰을 실행합니다.
  • SSP-BA는 입찰 전용 경매를 실행합니다.
  • SSP-MIX는 혼합 모드 입찰을 실행합니다.
  • SSP-TOP가 복수 판매자 입찰을 실행합니다.
    • SSP-OD/BA/MIXSSP-TOP의 다중 판매자 입찰의 구성요소 판매자로 참여합니다.

전체 아키텍처는 설계 다이어그램을 확인하세요.

5.4 입찰 서비스 구성

이 Codelab에서는 두 세트의 B&A를 나란히 실행합니다.

이제

서비스

참여자

ba-dev 네트워크 주소

세트 A

입찰 서비스

DSP-X

192.168.84.101:50057

BFE 서비스

DSP-X

192.168.84.102:50051

입찰 서비스

SSP-BA

192.168.84.103:50061

SFE 서비스

SSP-BA

192.168.84.104:50053

세트 B

입찰 서비스

DSP-Y

192.168.84.201:50057

BFE 서비스

DSP-Y

192.168.84.202:50051

입찰 서비스

SSP-MIX

192.168.84.203:50061

SFE 서비스

SSP-MIX

192.168.84.204:50053

로컬 테스트 앱

전체

https://192.168.84.100:PORT

  • 세트 A에서 구매자 서비스는 DSP-X에서 사용하고 판매자 서비스는 SSP-BA에서 사용합니다.
  • 세트 B에서 구매자 서비스는 DSP-Y에서 사용하고 판매자 서비스는 SSP-MIX에서 사용합니다.

로컬 테스트 앱과 B&A 서비스 간의 통신에는 Docker 브리지 네트워크가 사용됩니다. ba-dev 브리지 네트워크는 로컬 테스트 앱의 설정 스크립트에 의해 생성됩니다. B&A 서비스에는 192.168.84.0의 서브넷에 IP 주소가 할당됩니다.

예를 들어 애플리케이션에서 Set A의 SFE를 호출하면 192.168.84.104:50053의 네트워크 주소가 사용됩니다. DSP-X에서 BFE로 예시 입찰 스크립트를 로드할 때 https://192.168.84.100:5003/generate-bid.js가 사용됩니다.

6. 마무리

이제 로컬 머신에서 B&A 서비스 스택을 실행하는 방법을 숙지하고 서비스가 서로 통신하는 방식을 더 잘 이해하셨기를 바랍니다.

6.1. 기술 지원

6.2 자세히 알아보기