λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

λ„€νŠΈμ›Œν¬

[λ„€νŠΈμ›Œν¬] 동일 좜처 μ •μ±…κ³Ό ν—ˆμš© λ°©μ•ˆμ„ μ•Œμ•„λ³΄μž.

πŸ€” 동일 좜처 μ •μ±… (Same-Origin Policy), μ™œ λ“±μž₯ν•˜κ²Œ 된 걸까?

기쑴에 μ›Ή λΈŒλΌμš°μ €λŠ” ν•˜λ‚˜μ˜ μ„œλ²„μ—κ²Œ μš”μ²­ν•˜κ³ , μ„œλ²„λŠ” HTML νŒŒμΌμ„ λ°˜ν™˜ν•΄μ£Όκ²Œ 되고 μΆ”κ°€ μš”μ²­μ„ ν•œλ‹€ 해도 μ–΄λ””κΉŒμ§€λ‚˜ 같은 λ„λ©”μΈμ—μ„œ μ΄λ£¨μ–΄μ§€λŠ” μΌμ΄μ—ˆλ‹€. λ‹Ήμ—°μ‹œ μ—¬κ²¨μ§€λŠ” μΌμ΄μ—ˆκΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ λ„λ©”μΈμ—μ„œ μ ‘κ·Όν•˜λŠ” 것은 μ•…μ„± μ ‘κ·Όμ΄λ‚˜ μ•…μ˜μ μΈ ν–‰λ™μœΌλ‘œ 간주될 μˆ˜λ°–μ— μ—†μ—ˆκ³ , 같은 도메인이 μ•„λ‹ˆλ©΄ μš”μ²­ 자체λ₯Ό λ§‰λŠ” 선택을 ν•˜κ²Œ λ˜μ—ˆλ‹€. μ΄λŸ¬ν•œ 정책은 '동일 좜처 μ •μ±…'이라 ν•œλ‹€. 즉, μ›Ή λ³΄μ•ˆμ„ μœ„ν•΄ ν”„λ‘œν† μ½œ, 호슀트, ν¬νŠΈλ²ˆν˜Έκ°€ μΌμΉ˜ν•˜λŠ” μ„œλ²„λ‘œλ§Œ μš”μ²­μ„ 보낼 수 있게 ν•˜λŠ” 정책이닀.

😟 ν•˜μ§€λ§Œ!

μ˜€λŠ˜λ‚ , μ›Ή μ‚¬μ΄νŠΈκ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μˆ˜μ€€μœΌλ‘œ μ„±μž₯ν•˜κ²Œ 되고, λ‹¨μˆœνžˆ λ¬Έμ„œ 제곡만 ν•˜λŠ” 것이 μ•„λ‹ˆλΌ λ‹€μ–‘ν•œ νŽΈμ˜μ •λ³΄λ“€μ„ μ œκ³΅ν•˜κ²Œ λœλ‹€. μ‚¬μš©μžμ—κ²Œ λ‚ μ”¨λ‚˜ μ΅œμ‹  기사λ₯Ό μ œκ³΅ν•˜λŠ” λ“± 좔가적인 데이터λ₯Ό 가져와야 ν–ˆκ³ , 기쑴의 동일 좜처 μ •μ±… λ•Œλ¬Έμ— λΆˆνŽΈν•œ 점듀이 μƒκ²¨λ‚˜κΈ° μ‹œμž‘ν–ˆλ‹€. 

 

μ΄λŸ¬ν•œ 정책을 ν”Όν•΄ μ™ΈλΆ€ 데이터λ₯Ό κ°€μ Έμ˜€κΈ° μœ„ν•œ 방법듀이 λ“±μž₯ν•˜κ²Œ λ˜μ—ˆκ³  JSONP (JSON-Padding)κ°€ λŒ€ν‘œμ μ΄λ‹€.

🧐 JSONP ( JSON-Padding )

HTML 슀크립트(script) νƒœκ·Έμ—μ„œλŠ” λ‹€λ₯Έ λ„λ©”μΈμ˜ νŒŒμΌμ„ λΆˆλŸ¬μ˜€λŠ” 것이 κ°€λŠ₯ν–ˆλ‹€. 일반적으둜 슀크립트λ₯Ό λΆˆλŸ¬μ˜€λŠ” 데 μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯을 μžμ›μ„ κ°€μ Έμ˜€λŠ” 데 우회적으둜 μ‚¬μš©ν•˜λŠ” 방식이닀. 

 

슀크립트 νƒœκ·Έμ˜ src에?callback=콜백 ν•¨μˆ˜λͺ… 을 λΆˆμ—¬ μš”μ²­ν•˜λ©΄ μš”μ²­μ˜ κ²°κ³Όκ°€ 콜백 ν•¨μˆ˜μ˜ μΈμžμ— 객체둜 μ „λ‹¬λ˜μ–΄ 데이터λ₯Ό 가곡할 수 있게 ν•œλ‹€.

🧐 CORS (Cross-Origin-Resource-Sharing)

동일 좜처 정책을 무λ ₯ν™”μ‹œν‚¨ JSONP의 μˆ˜μš”λŠ” 점점 μ¦κ°€ν•˜κ²Œ 되고, κ²°κ΅­ μ΄λŸ¬ν•œ 우회 방법을 μ§€μ†μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ 곡식적인 방법을 μ œκ³΅ν•˜κ²Œ λ˜λŠ”λ° 이λ₯Ό CORS ( Cross-Origin-Resource-Sharing )이라 ν•œλ‹€. 

 

μ„œλ‘œ λ‹€λ₯Έ λ„λ©”μΈμ—μ„œ μžμ›μ„ μ£Όκ³ λ°›κΈ° μœ„ν•΄μ„œ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λͺ‡ 가지 μž‘μ—…μ„ ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

ν΄λΌμ΄μ–ΈνŠΈ

μš”μ²­μ„ 보낼 λ•Œ μš”μ²­ 해더에 CORS κ΄€λ ¨ 속성을 μΆ”κ°€ν•˜μ—¬ 전달해야 ν•œλ‹€. μ΄λ•Œ μ‚¬μš©λ˜λŠ” ν•„λ“œλŠ” Origin을 톡해 μš”μ²­μ„ λ³΄λ‚΄λŠ” 좜처λ₯Ό ν•¨κ»˜ 보낸닀. 

μ„œλ²„

μ„œλ²„λŠ” μš”μ²­μ˜ μ‘λ‹΅μœΌλ‘œ, 응닡 ν•΄λ”μ˜ Access-Control-Allow-Originλ₯Ό 톡해 이 μžμ›μ— μ ‘κ·Ό κ°€λŠ₯ν•œ 좜처λ₯Ό 보내쀀닀. μ΄λŸ¬ν•œ 응닡을 전달받은 ν΄λΌμ΄μ–ΈνŠΈλŠ” μžμ‹ μ΄ λ³΄λƒˆλ˜ μš”μ²­ ν•΄λ”μ˜ Originκ³Ό λΉ„κ΅ν•˜μ—¬ μœ νš¨ν•œμ§€λ₯Ό νŒŒμ•…ν•˜κ²Œ λœλ‹€.

 

μ–΄μ°Œ 보면 κ°„λ‹¨ν•˜μ§€λ§Œ, 사싀 CORS μš”μ²­μ„ 보낼 λ•Œ μ„œλ²„λ‘œ μš”μ²­μ„ ν•œ 번만 λ³΄λ‚΄λŠ” 것이 μ•„λ‹ˆλΌ, HTTP λ©”μ„œλ“œμΈ OPTION을 톡해 μ˜ˆλΉ„ μš”μ²­μ„ μš°μ„ μ μœΌλ‘œ μ „λ‹¬ν•œλ‹€. μ΄λŸ¬ν•œ μ˜ˆλΉ„ μš”μ²­μ„ ν”„λ¦¬ν”ŒλΌμ΄νŠΈ(preflight)라 ν•˜λ©°, λΈŒλΌμš°μ € 슀슀둜 이 μš”μ²­μ„ λ³΄λ‚΄λŠ” 것이 μ•ˆμ „ν•œ 지λ₯Ό νŒλ‹¨ν•  수 있게 λœλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ 해더에 Origin ν•„λ“œλ₯Ό λ‹΄μ•„ μ˜ˆλΉ„ μš”μ²­μ„ λ³΄λ‚΄κ²Œ 되면, μ„œλ²„λŠ” μ˜ˆλΉ„ μš”μ²­μ˜ μ‘λ‹΅μœΌλ‘œ μ–΄λ–€ 것을 ν—ˆμš©ν•˜κ³  κΈˆμ§€ν•˜λŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό 응닡 해더에 λ‹΄μ•„ λ³΄λ‚΄κ²Œ λœλ‹€.