๋ด‡ ๊ด€๋ฆฌ ๊ตฌ์„ฑ

์ด ํŽ˜์ด์ง€์—๋Š” ๋ด‡ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Google Cloud Armor ๋ณด์•ˆ ์ •์ฑ… ๊ทœ์น™์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ด‡ ๊ด€๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋จผ์ € ๋ด‡ ๊ด€๋ฆฌ ๊ฐœ์š”์˜ ์ •๋ณด๋ฅผ ์ˆ™์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Google Cloud Armor ๋ณด์•ˆ ์ •์ฑ…์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  Identity and Access Management(IAM) ์—ญํ•  ๋ฐ ๊ถŒํ•œ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” compute.securityPolicies.create ๋ฐ compute.securityPolicies.update ๊ถŒํ•œ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Google Cloud Armor ๋ณด์•ˆ ์ •์ฑ…์˜ IAM ๊ถŒํ•œ ์„ค์ •

๋‹ค์Œ ์ž‘์—…์—๋Š” Identity and Access Management(IAM) Compute ๋ณด์•ˆ ๊ด€๋ฆฌ์ž ์—ญํ• (roles/compute.securityAdmin)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • Google Cloud Armor ๋ณด์•ˆ ์ •์ฑ… ๊ตฌ์„ฑ, ์ˆ˜์ •, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ
  • ๋‹ค์Œ API ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ:
    • SecurityPolicies insert
    • SecurityPolicies delete
    • SecurityPolicies patch
    • SecurityPolicies addRule
    • SecurityPolicies patchRule
    • SecurityPolicies removeRule

Compute ๋„คํŠธ์›Œํฌ ๊ด€๋ฆฌ์ž ์—ญํ• (roles/compute.networkAdmin)์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์˜ Google Cloud Armor ๋ณด์•ˆ ์ •์ฑ… ์„ค์ •
  • ๋‹ค์Œ API ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ:
    • BackendServices setSecurityPolicy
    • BackendServices list(gcloud๋งŒ)

๋ณด์•ˆ ๊ด€๋ฆฌ์ž ์—ญํ• (roles/iam.securityAdmin) ๋ฐ Compute ๋„คํŠธ์›Œํฌ ๊ด€๋ฆฌ์ž ์—ญํ• ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” SecurityPolicies API ๋ฉ”์„œ๋“œ get, list, getRule์„ ์‚ฌ์šฉํ•˜์—ฌ Google Cloud Armor ๋ณด์•ˆ ์ •์ฑ…์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์—ญํ• ์— ๋Œ€ํ•œ IAM ๊ถŒํ•œ ์„ค์ •

๋‹ค์Œ ํ‘œ์—๋Š” IAM ์—ญํ• ์˜ ๊ธฐ๋ณธ ๊ถŒํ•œ๊ณผ ๊ด€๋ จ API ๋ฉ”์„œ๋“œ๊ฐ€ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

IAM ๊ถŒํ•œ API ๋ฉ”์„œ๋“œ
compute.securityPolicies.create SecurityPolicies insert
compute.securityPolicies.delete SecurityPolicies delete
compute.securityPolicies.get SecurityPolicies get
SecurityPolicies getRule
compute.securityPolicies.list SecurityPolicies list
compute.securityPolicies.use BackendServices setSecurityPolicy
compute.securityPolicies.update SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies removeRule
compute.backendServices.setSecurityPolicy BackendServices setSecurityPolicy

reCAPTCHA ์ˆ˜๋™ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๊ฐ„๊ณผ ์ž๋™ ํด๋ผ์ด์–ธํŠธ ๊ตฌ๋ณ„

Google Cloud Armor์™€ ํ•จ๊ป˜ reCAPTCHA ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด CHALLENGEPAGE ์œ ํ˜•์˜ reCAPTCHA WAF ์‚ฌ์ดํŠธ ํ‚ค(reCAPTCHA ํ‚ค)๋ฅผ ๋ณด์•ˆ ์ •์ฑ…๊ณผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. reCAPTCHA ํ‚ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ reCAPTCHA ํ‚ค ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž์ฒด reCAPTCHA ํ‚ค๋ฅผ ๋ณด์•ˆ ์ •์ฑ…๊ณผ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ ํ•ด์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud compute security-policies update SECURITY_POLICY \
    --recaptcha-redirect-site-key SITE_KEY

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • SECURITY_POLICY: ๋ณด์•ˆ ์ •์ฑ…์˜ ์ด๋ฆ„
  • SITE_KEY: reCAPTCHA CHALLENGEPAGE ํ‚ค

reCAPTCHA ํ‚ค ์—ฐ๊ฒฐ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” reCAPTCHA ํ‚ค๋ฅผ ๋ณด์•ˆ ์ •์ฑ…๊ณผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ reCAPTCHA ํ‚ค๋Š” ํŠน์ • ๋ณด์•ˆ ์ •์ฑ…์— ๋”ฐ๋ผ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ทœ์น™์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

gcloud compute security-policies update SECURITY_POLICY \
    --recaptcha-redirect-site-key "SITE_KEY"

reCAPTCHA ํ‚ค ์—ฐ๊ฒฐ ํ•ด์ œ

reCAPTCHA ํ‚ค์™€ ๋ณด์•ˆ ์ •์ฑ…์˜ ์—ฐ๊ฒฐ์„ ํ•ด์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud compute security-policies update SECURITY_POLICY \
    --recaptcha-redirect-site-key ""

reCAPTCHA ํ‰๊ฐ€๋ฅผ ์œ„ํ•ด ํŠธ๋ž˜ํ”ฝ ๋ฆฌ๋””๋ ‰์…˜

reCAPTCHA ํ‚ค๋ฅผ ๋ณด์•ˆ ์ •์ฑ…๊ณผ ์—ฐ๊ฒฐํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ์ •์ฑ… ๋‚ด์—์„œ reCAPTCHA ํ‰๊ฐ€๋ฅผ ์œ„ํ•ด ํŠธ๋ž˜ํ”ฝ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ๊ทœ์น™์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. gcloud CLI์—์„œ ๋‹ค์Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค.

gcloud compute security-policies rules create PRIORITY \
  --security-policy SECURITY_POLICY \
  {--expression EXPRESSION | --src-ip-ranges SRC_IP_RANGE} \
  --action redirect \
  --redirect-type google-recaptcha

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • PRIORITY: ๊ทœ์น™์„ ๋งŒ๋“ค ๋•Œ ๋”ฐ๋ฅด๋Š” ์šฐ์„ ์ˆœ์œ„
  • SECURITY_POLICY: ๋ณด์•ˆ ์ •์ฑ…์˜ ์ด๋ฆ„
  • EXPRESSION: reCAPTCHA ํ‰๊ฐ€๋ฅผ ์ ์šฉํ•  ํŠธ๋ž˜ํ”ฝ๊ณผ ์ผ์น˜ํ•˜๋Š” ์ปค์Šคํ…€ ๊ทœ์น™ ์–ธ์–ด ํ‘œํ˜„์‹
  • SRC_IP_RANGE: IP ์ฃผ์†Œ ๋ฒ”์œ„. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฒ”์œ„์˜ ๋ชจ๋“  ์š”์ฒญ์— reCAPTCHA ํ‰๊ฐ€๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” reCAPTCHA ์ˆ˜๋™ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด /login.html์— ๋„๋‹ฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ๊ทœ์น™์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud compute security-policies rules create 1000 \
    --security-policy SECURITY_POLICY \
    --expression "request.path.matches(\"/login.html\")" \
    --action redirect \
    --redirect-type google-recaptcha

reCAPTCHA ์›ํ™œํ•œ ํ‰๊ฐ€ ์‹œํ–‰

๊ณ„์†ํ•˜๊ธฐ ์ „์— reCAPTCHA ์ž‘์—… ํ† ํฐ ๋˜๋Š” ์„ธ์…˜ ํ† ํฐ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์š”๊ฑด์€ ๋ด‡ ๊ด€๋ฆฌ ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

reCAPTCHA ์ž‘์—… ํ† ํฐ์—์„œ ์†์„ฑ์„ ์ถ”์ถœํ•˜๋ ค๋ฉด token.recaptcha_action.ATTRIBUTE๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ATTRIBUTE๋ฅผ Google Cloud Armor ๊ทœ์น™ ์–ธ์–ด์˜ ์œ ํšจํ•œ ํ† ํฐ ์†์„ฑ์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ token.recaptcha_session.ATTRIBUTE๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ reCAPTCHA ์„ธ์…˜ ํ† ํฐ์—์„œ ์†์„ฑ์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ reCAPTCHA ํ† ํฐ ์†์„ฑ์˜ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ทœ์น™ ์–ธ์–ด ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

์ž‘์—… ํ† ํฐ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹œ์ž‘๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ธ์…˜ ํ† ํฐ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋งŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ๋งˆ๋‹ค ๋ณ„๋„์˜ reCAPTCHA ํ‚ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. token.recaptcha_action.ATTRIBUTE ๋ฐ token.recaptcha_session.ATTRIBUTE ํ‘œํ˜„์‹์€ ์ด๋Ÿฌํ•œ ํ”Œ๋žซํผ์˜ ํ† ํฐ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ† ํฐ์„ ํ”Œ๋žซํผ๋งˆ๋‹ค ๊ตฌ๋ถ„ํ•˜๊ณ  ํ† ํฐ ๋„๋‚œ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ด๋Ÿฌํ•œ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™์„ ๊ตฌ์„ฑํ•  ๋•Œ reCAPTCHA ํ‚ค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ

์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ๋Š” ์ ์ˆ˜๊ฐ€ 0.8 ์ด์ƒ์ธ reCAPTCHA ์ž‘์—… ํ† ํฐ์œผ๋กœ /login.html์„ ํƒ€๊ฒŸํŒ…ํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ทœ์น™์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud compute security-policies rules create 1000 \
    --security-policy SECURITY_POLICY \
    --expression "request.path.matches(\"/login.html\") && token.recaptcha_action.score >= 0.8" \
    --action allow

๋‘ ๋ฒˆ์งธ ์˜ˆ์‹œ๋Š” ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ์™€ ๋™์ผํ•˜์ง€๋งŒ ์ž‘์—… ํ† ํฐ์ด example-site-key-1 ๋˜๋Š” example-site-key-2์˜ reCAPTCHA ํ‚ค๋กœ ๋ฐœ๊ธ‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud compute security-policies rules create 1000 \
    --security-policy SECURITY_POLICY \
    --expression "request.path.matches(\"/login.html\") && token.recaptcha_action.score >= 0.8" \
    --recaptcha-action-site-keys "example-site-key-1,example-site-key-2" \
    --action allow

์„ธ ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ๋Š” example-site-key-3์˜ reCAPTCHA ํ‚ค๋กœ ๋ฐœ๊ธ‰๋œ reCAPTCHA ์„ธ์…˜ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ ์ˆ˜๊ฐ€ 0.8 ์ด์ƒ์ธ /login.html์„ ํƒ€๊ฒŸํŒ…ํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ทœ์น™์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud compute security-policies rules create 1000 \
    --security-policy SECURITY_POLICY \
    --expression "request.path.matches(\"/login.html\") && token.recaptcha_session.score >= 0.8" \
    --recaptcha-session-site-keys "example-site-key-3" \
    --action allow

๋ฆฌ๋””๋ ‰์…˜(302 ์‘๋‹ต)

ํŠธ๋ž˜ํ”ฝ์„ ์‚ฌ์šฉ์ž ๊ตฌ์„ฑ URL๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ๊ทœ์น™์„ ๋งŒ๋“ค๋ ค๋ฉด Google Cloud CLI์—์„œ ๋‹ค์Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud compute security-policies rules create PRIORITY \
    --security-policy SECURITY_POLICY \
    {--expression EXPRESSION | --src-ip-ranges SRC_IP_RANGE} \
    --action redirect \
    --redirect-type external-302 \
    --redirect-target REDIRECT_URL

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • PRIORITY: ๊ทœ์น™์„ ๋งŒ๋“ค ๋•Œ ๋”ฐ๋ฅด๋Š” ์šฐ์„ ์ˆœ์œ„
  • SECURITY_POLICY: ๋ณด์•ˆ ์ •์ฑ…์˜ ์ด๋ฆ„
  • EXPRESSION: reCAPTCHA ํ‰๊ฐ€๋ฅผ ์ ์šฉํ•  ํŠธ๋ž˜ํ”ฝ๊ณผ ์ผ์น˜ํ•˜๋Š” ์ปค์Šคํ…€ ๊ทœ์น™ ์–ธ์–ด ํ‘œํ˜„์‹
  • SRC_IP_RANGE: IP ์ฃผ์†Œ ๋ฒ”์œ„. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฒ”์œ„์˜ ๋ชจ๋“  ์š”์ฒญ์— reCAPTCHA ํ‰๊ฐ€๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • REDIRECT_URL: ํŠธ๋ž˜ํ”ฝ์„ ๋ฆฌ๋””๋ ‰์…˜ํ•  URL

๋‹ค์Œ์€ 10.10.10.0/24์—์„œ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ https://www.example.com์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ๊ทœ์น™์„ ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

gcloud compute security-policies rules create 1000 \
   --security-policy SECURITY_POLICY \
   --src-ip-ranges "10.10.10.0/24" \
   --action redirect \
   --redirect-type external-302 \
   --redirect-target "https://www.example.com"

์š”์ฒญ ๋ฐ์ฝ”๋ ˆ์ด์…˜

ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์ปค์Šคํ…€ ํ—ค๋”์™€ ์‚ฌ์šฉ์ž ์ •์˜ ์ •์  ๊ฐ’์„ ๋ณดํ˜ธ๋œ ๋ฐฑ์—”๋“œ๋กœ ์ „์†กํ•˜๊ธฐ ์ „์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ทœ์น™์„ ๋งŒ๋“ค๋ ค๋ฉด gcloud CLI์—์„œ ๋‹ค์Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud compute security-policies rules create PRIORITY \
    --security-policy SECURITY_POLICY \
    {--expression EXPRESSION | --src-ip-ranges SRC_IP_RANGE} \
    --action allow \
    --request-headers-to-add HEADER_1=VALUE_1,HEADER_2=VALUE_2,...

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • PRIORITY: ๊ทœ์น™์„ ๋งŒ๋“ค ๋•Œ ๋”ฐ๋ฅด๋Š” ์šฐ์„ ์ˆœ์œ„
  • SECURITY_POLICY: ๋ณด์•ˆ ์ •์ฑ…์˜ ์ด๋ฆ„
  • EXPRESSION: reCAPTCHA ํ‰๊ฐ€๋ฅผ ์ ์šฉํ•  ํŠธ๋ž˜ํ”ฝ๊ณผ ์ผ์น˜ํ•˜๋Š” ์ปค์Šคํ…€ ๊ทœ์น™ ์–ธ์–ด ํ‘œํ˜„์‹
  • SRC_IP_RANGE: IP ์ฃผ์†Œ ๋ฒ”์œ„. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฒ”์œ„์˜ ๋ชจ๋“  ์š”์ฒญ์— reCAPTCHA ํ‰๊ฐ€๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • HEADER_#: ์š”์ฒญ์„ ๋ฐ์ฝ”๋ ˆ์ด์…˜ํ•  ์š”์ฒญ ํ—ค๋”์˜ ์ด๋ฆ„
  • VALUE_#: ์š”์ฒญ์„ ๋ฐ์ฝ”๋ ˆ์ด์…˜ํ•  ์š”์ฒญ ํ—ค๋”์˜ ๊ฐ’

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์š”์ฒญ์˜ reCAPTCHA ์ž‘์—… ํ† ํฐ ์ ์ˆ˜๊ฐ€ 0.2 ์ดํ•˜์ธ ๊ฒฝ์šฐ /login.html์„ ํƒ€๊ฒŸํŒ…ํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ทœ์น™์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud compute security-policies rules create 1000 \
    --security-policy SECURITY_POLICY \
    --expression "request.path.matches("/login.html") && token.recaptcha_action.score < 0.2" \
    --action allow \
    --request-headers-to-add "reCAPTCHA-Warning=high"

๋‹ค์Œ ๋‹จ๊ณ„