Skip to content
IT/Tech-Guide

GAS CORS ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Simple Request ์ „๋žต์œผ๋กœ API ํ†ต์‹  ์•ˆ์ •ํ™”

GAS CORS ์˜ค๋ฅ˜ ์šฐํšŒ๋ฐฉ๋ฒ•: Simple Request ์ „๋žต์œผ๋กœ ์™ธ๋ถ€ ์›น ํ†ต์‹  ํ•ด๊ฒฐ

GAS๊ฐ€ OPTIONS ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•ด ๋ฐœ์ƒํ•˜๋Š” 405ยทํ—ค๋” ์˜ค๋ฅ˜์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜๊ณ , ์š”์ฒญ ๋ฐฉ์‹ ์ „ํ™˜๋งŒ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์šฐํšŒํ•ด ๊ฐœ๋ฐœ ์•ˆ์ •์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


Google Apps Script(GAS) ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ณ ์งˆ์ ์ธ GAS CORS ์˜ค๋ฅ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์™ธ๋ถ€ ์›น์‚ฌ์ดํŠธ์™€ ์•ˆ์ •์ ์ธ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. Simple Request ์ „๋žต์„ ํ™œ์šฉํ•˜์—ฌ GAS ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” CORS ์˜ค๋ฅ˜๋ฅผ ์™„๋ฒฝํžˆ ์šฐํšŒํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒ์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

CORS ์˜ค๋ฅ˜์˜ ๊ทผ๋ณธ ์›์ธ๊ณผ HTTP ์š”์ฒญ ๋ฐฉ์‹ ๋ถ„์„

CORS ์˜ค๋ฅ˜๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณด์•ˆ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ง‰์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์•ˆ ์ •์ฑ… ์œ„๋ฐ˜ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ "๋‹ค๋ฅธ ์‚ฌ์ดํŠธ(B) ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•˜๋ฉด", ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ ์ •ํ™•ํ•œ ํ—ˆ์šฉ ์„ค์ •์„ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์š”์ฒญ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” HTTP์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

1. GET ๋ฐฉ์‹: ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ (Read)

GET์€ ์„œ๋ฒ„์—์„œ ์ •๋ณด๋ฅผ ์ฝ๊ธฐ(Read) ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์š”์ฒญ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. URL ๋’ค์— ?name=value ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • ์š”์ฒญ ๋ฐฉ์‹ ์ค‘ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ๋‹จ์ˆœํ•จ, ์บ์‹ฑ์ด ๊ฐ€๋Šฅํ•ด ๋ฐ˜๋ณต ์š”์ฒญ ์†๋„๊ฐ€ ๋นจ๋ผ์ง
  • ๋ธŒ๋ผ์šฐ์ € API ๋“ฑ ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘

๋‹จ์ 

  • ๋ฐ์ดํ„ฐ๊ฐ€ URL์— ๋…ธ์ถœ๋ผ ๋ณด์•ˆ์ด ์•ฝํ•จ, ์ „์†ก ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๊ธธ์ด์— ์ œํ•œ ์žˆ์Œ
  • ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ž‘์—…์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ

2. POST ๋ฐฉ์‹: ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐ ์ฒ˜๋ฆฌ ์š”์ฒญ (Create)

POST๋Š” ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ์ƒ์„ฑ/์ฒ˜๋ฆฌ(Create) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” body(๋ณธ๋ฌธ)์— ๋‹ด๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์–‘์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  • body ์‚ฌ์šฉ์œผ๋กœ ๋ณด์•ˆ์„ฑ์ด GET๋ณด๋‹ค ๋†’์Œ, ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ€๋Šฅ
  • ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, AI ํ”„๋กฌํ”„ํŠธ ๋“ฑ ์ฒ˜๋ฆฌ ์ž‘์—…์— ์ตœ์ ํ™”

๋‹จ์ 

  • ์บ์‹ฑ์ด ์–ด๋ ค์›€, application/json ์‚ฌ์šฉ ์‹œ Preflight(OPTIONS) ๋ฐœ์ƒ์œผ๋กœ CORS ์˜ค๋ฅ˜ ์œ„ํ—˜

3. OPTIONS ์‚ฌ์ „ ์š”์ฒญ(Preflight) ์ฒดํฌ

OPTIONS๋Š” ์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „, ์ด ์š”์ฒญ์„ ์ด ์„œ๋ฒ„๊ฐ€ ๋ฐ›์•„์ค„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์ „ ์š”์ฒญ์ž…๋‹ˆ๋‹ค. CORS์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋‹จ์ 

  • ์‹ค์ œ ์š”์ฒญ ์ „์— ํ•œ ๋ฒˆ ๋” ํ†ต์‹ ํ•˜์—ฌ ์†๋„ ์ €ํ•˜
  • Google Apps Script(GAS)๋Š” OPTIONS๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„ 405 ์˜ค๋ฅ˜ ๋ฐœ์ƒ

4. PUT / PATCH / DELETE: ๋ฐ์ดํ„ฐ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ (Update/Delete)

์ด ์š”์ฒญ๋“ค์€ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •/์‚ญ์ œ(Update/Delete) ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ REST API์—์„œ ์ž์ฃผ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  • ๋Œ€๋ถ€๋ถ„ Preflight(OPTIONS) ๋ฐœ์ƒ, CORS ๋ฌธ์ œ ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ

๊ฒฐ๋ก ์ ์œผ๋กœ, Google Apps Script(GAS)์—์„œ ๋ฐœ์ƒํ•˜๋Š”GAS CORS ์˜ค๋ฅ˜๋Š” ์™ธ๋ถ€ ์›น์‚ฌ์ดํŠธ ํ†ต์‹ ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์žฅ์•  ์š”์ธ์ž…๋‹ˆ๋‹ค.


GAS CORS ์˜ค๋ฅ˜ ์œ ํ˜• ๋ฐ Simple Request ์ „๋žต ๋„์ž…

1. 405 Method Not Allowed ์˜ค๋ฅ˜

์™ธ๋ถ€ ํด๋ผ์ด์–ธํŠธ์—์„œ POST ์š”์ฒญ ์‹œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋จผ์ € OPTIONS ์š”์ฒญ์„ ๋ณด๋‚ด์ง€๋งŒ, GAS๋Š” ๋ณ„๋„์˜ OPTIONS ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†์–ด 405 ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์ƒํ™ฉ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ์ƒํƒœ
OPTIONS ์š”์ฒญ ์ฒ˜๋ฆฌ ์—†์Œ 405 Method Not Allowed ๋ฐœ์ƒ "๊ฒ€๋ฌธ์†Œ ์ฐจ๋‹จ"

2. setHeader is not a function ์˜ค๋ฅ˜

GAS ์‘๋‹ต ๊ฐ์ฒด์— CORS ํ—ˆ์šฉ ํ—ค๋”(Access-Control-Allow-Origin: *)๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค ํ•ด๋„, ContentService.createTextOutput() ๊ฐ์ฒด์—๋Š” `setHeader` ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์•„ GAS CORS ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.

  • ์‹ค์ œ ์ƒํ™ฉ: ContentService ๊ฐ์ฒด๋Š” ๋‹จ์ˆœ ํ…์ŠคํŠธ ์ถœ๋ ฅ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ—ค๋” ์กฐ์ž‘์ด ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
GAS CORS ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Simple Request ์ „๋žต์œผ๋กœ CORS ์˜ค๋ฅ˜ ์šฐํšŒ

CORS ์˜ค๋ฅ˜๋Š” ๋Œ€๋ถ€๋ถ„ ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ(Preflight)์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Simple Request ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญํ•˜๋ฉด ์ด Preflight ์ž์ฒด๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๋˜์–ด CORS ์˜ค๋ฅ˜๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ GAS CORS ์˜ค๋ฅ˜๋Š” ๋ชจ๋‘ ํ—ค๋” ์กฐ์ž‘ ๋ฌธ์ œ์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ Pre-flight ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๋„๋ก ํ•˜๋Š” Simple Request ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Simple Request ์กฐ๊ฑด

๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด GAS๋Š” ์š”์ฒญ์„ Form Data๋กœ ์ธ์‹ํ•˜๊ณ , ์ž๋™์œผ๋กœ CORS ํ—ˆ์šฉ ํ—ค๋”๋ฅผ ์‘๋‹ต์— ๋ถ™์—ฌ์ฃผ์–ด GAS CORS ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ํ•„์ˆ˜ ๊ฐ’ ์—ญํ• 
Method POST (๋˜๋Š” GET/HEAD) ์ง์ง„ ํ†ต๊ณผ
Content-Type application/x-www-form-urlencoded ์ •ํ•ด์ง„ ์„œ๋ฅ˜ ์–‘์‹

Simple Request๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ 3๊ฐ€์ง€ ํ•„์ˆ˜ ์กฐ๊ฑด

์กฐ๊ฑด 1. ํ—ˆ์šฉ๋œ HTTP ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

  • GET, HEAD, POST๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • PUT, PATCH, DELETE ์‚ฌ์šฉ ์‹œ Simple Request๋Š” ๋ถˆ๊ฐ€ํ•˜๋ฉฐ Preflight๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์กฐ๊ฑด 2. ์š”์ฒญ ํ—ค๋”๋Š” ์•ˆ์ „ํ•œ ํ—ค๋”๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ—ˆ์šฉํ•œ ๊ธฐ๋ณธ ํ—ค๋”๋“ค๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Accept
  • Accept-Language
  • Content-Type (ํŠน์ • ๊ฐ’๋งŒ)

์กฐ๊ฑด 3. Content-Type์€ ์•„๋ž˜ 3๊ฐœ๋งŒ ๊ฐ€๋Šฅ

์•„๋ž˜ 3๊ฐœ ์™ธ ๋‹ค๋ฅธ ๊ฐ’์ด๋ฉด 100% Preflight ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

text/plain, application/x-www-form-urlencoded, multipart/form-data

โŒ application/json๊ณผ ๊ฐ™์€ ํ˜•์‹์€ Simple Request๊ฐ€ ๋  ์ˆ˜ ์—†์œผ๋ฉฐ Preflight๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.


ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์ฝ”๋“œ ์ตœ์ ํ™” ๊ฐ€์ด๋“œ

Simple Request ์ „๋žต์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์•ผ GAS CORS ์˜ค๋ฅ˜๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ ๊ธฐ์กด (CORS ๋ฐœ์ƒ) ์ˆ˜์ • (Simple Request) ํšจ๊ณผ
ํด๋ผ์ด์–ธํŠธ ํ—ค๋” Content-Type: application/json Content-Type: application/x-www-form-urlencoded Pre-flight ์š”์ฒญ ์ƒ๋žต
์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ `JSON.parse(e.postData.contents)` `e.parameter.prompt` Form Data๋ฅผ ๋ฐ”๋กœ ์ฝ์–ด ์˜ค๋ฅ˜ ์ œ๊ฑฐ

1. ํด๋ผ์ด์–ธํŠธ (HTML/JS) ์ฝ”๋“œ ์˜ˆ์‹œ

๋ฐ์ดํ„ฐ๋ฅผ `URLSearchParams`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Form Data ํ˜•ํƒœ๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

async function callAppsScript(prompt) {
const formData = new URLSearchParams();
formData.append('prompt', prompt);

const response = await fetch(GOOGLE_SCRIPT_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded', // Simple Request ํ•„์ˆ˜
},
body: formData.toString() // Form Data ์ „์†ก
});
return await response.text();
}

2. ์„œ๋ฒ„ (Apps Script) ์ฝ”๋“œ ์˜ˆ์‹œ

์ „์†ก๋œ Form Data๋ฅผ `e.parameter` ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

function doPost(e) {
const userPrompt = e.parameter.prompt; // e.parameter๋กœ Form Data ์ง์ ‘ ์ ‘๊ทผ
if (!userPrompt) {
return createTextResponse("Error: ์š”์ฒญ ๋ณธ๋ฌธ์— 'prompt'๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
}
return createTextResponse("์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!");
}

function createTextResponse(content) {
const output = ContentService.createTextOutput(content);
output.setMimeType(ContentService.MimeType.TEXT);
return output; // setHeader ์—†์ด๋„ GAS๊ฐ€ ์ž๋™ CORS ์ฒ˜๋ฆฌ
}

FAQ: GAS CORS ์˜ค๋ฅ˜ ๊ด€๋ จ ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

Q1: ์™œ ContentService.createTextOutput์—๋Š” setHeader๊ฐ€ ์—†๋‚˜์š”?

A1: Apps Script์˜ ContentService๋Š” ๋‹จ์ˆœ ํ…์ŠคํŠธ ์ถœ๋ ฅ์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์–ด ํ—ค๋” ์กฐ์ž‘์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. Simple Request ์ „๋žต์œผ๋กœ ์šฐํšŒํ•˜๋Š” ๊ฒƒ์ด ์ตœ์ ์ž…๋‹ˆ๋‹ค.

Q2: Simple Request ์ „๋žต์ด ๋ชจ๋“  CORS ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋‚˜์š”?

A2: ๋Œ€๋ถ€๋ถ„์˜ ๋‹จ์ˆœ POST ์š”์ฒญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” 405 ์˜ค๋ฅ˜์™€ `setHeader` ๋ถ€์žฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํŠน์ˆ˜ ์ธ์ฆ ํ—ค๋”๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ์š”์ฒญ์˜ ๊ฒฝ์šฐ, ํ”„๋ก์‹œ ์„œ๋ฒ„ ๋“ฑ ์ถ”๊ฐ€ ๋Œ€์‘์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q3: e.parameter ๋Œ€์‹  e.postData.contents๋ฅผ ์จ๋„ ๋˜๋‚˜์š”?

A3: `e.postData.contents`๋Š” ์ฃผ๋กœ JSON ์‚ฌ์šฉ ์‹œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ OPTIONS ์š”์ฒญ์„ ๋ณด๋‚ด GAS CORS ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Form Data์™€ `e.parameter` ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

5. ์ตœ์ข… GAS CORS ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

์ •๋ฆฌํ•˜๋ฉด, GAS CORS ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๋Š” ํ•ต์‹ฌ 5๊ฐ€์ง€ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ: `Content-Type`์„ `application/x-www-form-urlencoded`๋กœ ์„ค์ •
  2. ํด๋ผ์ด์–ธํŠธ: `URLSearchParams`๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜์—ฌ POST
  3. ์„œ๋ฒ„: `e.parameter`๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ
  4. ์„œ๋ฒ„: `ContentService.createTextOutput`๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต ๋ฐ˜ํ™˜
  5. ๋ฐฐํฌ: Apps Script๋ฅผ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ์žฌ๋ฐฐํฌ

์ด ๊ฐ„๋‹จํ•œ Simple Request ๋ฐฉ๋ฒ•์œผ๋กœ ์™ธ๋ถ€ ์›น์‚ฌ์ดํŠธ์™€ ์•ˆ์ •์ ์ธ API ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” GAS CORS ์˜ค๋ฅ˜๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ  ์•ˆ์ „ํ•œ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Latest in this category

    ์ฟ ํŒกํŒŒํŠธ๋„ˆ์Šค API V2 ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ์‹ ์ƒํ’ˆ ๋ฐ ์ธ๊ธฐ์ƒํ’ˆ์ด ์ž๋™ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

    AI ์ฑ—๋ด‡์œผ๋กœ ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉˆ์ถค
    ๋…ธ๋ž˜ ์žฌ์ƒ ๋ฉˆ์ถค