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

CORS(Cross-Origin Resource Sharing)에 λŒ€ν•œ 이해와 λŒ€μ‘ 방법

by πŸ’²πŸŽ΅βœ–οΈβœ”οΈβ˜Ό 2024. 2. 14.
728x90

CORS(Cross-Origin Resource Sharing)에 λŒ€ν•œ 이해와 λŒ€μ‘ 방법

1. CORSλž€?

1.1 CORS의 κ°œλ…

CORSλŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ³΄μ•ˆμ„ κ°•ν™”ν•˜κΈ° μœ„ν•΄ λ„μž…λœ μ •μ±… 쀑 ν•˜λ‚˜λ‘œ, μ›Ή νŽ˜μ΄μ§€μ—μ„œ λ¦¬μ†ŒμŠ€κ°€ λ‹€λ₯Έ 도메인에 μžˆλŠ” 경우 λΈŒλΌμš°μ €μ—μ„œ λ³΄μ•ˆμƒμ˜ 이유둜 이 λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•˜λŠ” 것을 μ œν•œν•˜λŠ” μ •μ±…μž…λ‹ˆλ‹€.

1.2 μ™œ CORSκ°€ ν•„μš”ν•œκ°€?

λ³΄μ•ˆ μƒμ˜ 이유둜 인해 λΈŒλΌμš°μ €λŠ” 동일 좜처 μ •μ±…(Same-Origin Policy)을 λ”°λ₯΄κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ›Ή νŽ˜μ΄μ§€μ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•  λ•Œ, ν•΄λ‹Ή λ¦¬μ†ŒμŠ€μ™€ μ›Ή νŽ˜μ΄μ§€μ˜ 좜처(ν”„λ‘œν† μ½œ, 도메인, ν¬νŠΈκ°€ μΌμΉ˜ν•˜λŠ” 경우)κ°€ κ°™μ•„μ•Όλ§Œ μš”μ²­μ΄ ν—ˆμš©λœλ‹€λŠ” κ·œμΉ™μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν˜„λŒ€μ˜ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” λ‹€μ–‘ν•œ 좜처의 λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ λ§Žμ•„μ‘ŒκΈ° λ•Œλ¬Έμ— CORSκ°€ ν•„μš”ν•©λ‹ˆλ‹€.

2. CORS λ°œμƒ 원인

CORS 였λ₯˜λŠ” 주둜 λ‹€μŒκ³Ό 같은 κ²½μš°μ— λ°œμƒν•©λ‹ˆλ‹€.

2.1 λ‹€λ₯Έ 좜처둜의 AJAX μš”μ²­

μ›Ή νŽ˜μ΄μ§€μ—μ„œ λ‹€λ₯Έ λ„λ©”μΈμ˜ APIλ‚˜ λ¦¬μ†ŒμŠ€μ— 직접 AJAX μš”μ²­μ„ λ³΄λ‚΄λŠ” 경우, λΈŒλΌμš°μ €λŠ” Same-Origin Policy에 따라 μš”μ²­μ„ μ°¨λ‹¨ν•©λ‹ˆλ‹€.

2.2 νŠΉμ • ν—€λ”μ˜ μ‚¬μš©

νŠΉμ • 헀더(예: Authorization, Content-Type)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλ²„μ— μš”μ²­μ„ λ³΄λ‚΄λŠ” 경우, 사전 검사(preflight) μš”μ²­μ΄ λ°œμƒν•˜κ³  μ„œλ²„κ°€ CORSλ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ©΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

3. CORS 였λ₯˜ λŒ€μ‘λ²•

CORS 였λ₯˜λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‹€μ–‘ν•œ 방법이 μžˆμŠ΅λ‹ˆλ‹€.

3.1 μ„œλ²„ μΈ‘ μ„€μ •

μ„œλ²„μ—μ„œ CORSλ₯Ό ν—ˆμš©ν•˜λ„λ‘ μ„€μ •ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€. μ„œλ²„μ—μ„œλŠ” 응닡 헀더에 Access-Control-Allow-Origin λ“±μ˜ 헀더λ₯Ό μ„€μ •ν•˜μ—¬ μ–΄λ–€ μΆœμ²˜μ—μ„œμ˜ μš”μ²­μ„ ν—ˆμš©ν• μ§€ λͺ…μ‹œν•©λ‹ˆλ‹€.

// Express.jsλ₯Ό μ‚¬μš©ν•˜λŠ” 경우
const express = require('express');
const app = express();

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*'); // λͺ¨λ“  좜처 ν—ˆμš©
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  next();
});

// λ‚˜λ¨Έμ§€ λΌμš°νŒ… 및 미듀웨어 처리

3.2 JSONP μ‚¬μš©

JSONP(JSON with Padding)λ₯Ό ν™œμš©ν•˜μ—¬ μ„œλ‘œ λ‹€λ₯Έ 좜처 간에 데이터λ₯Ό 주고받을 수 μžˆμŠ΅λ‹ˆλ‹€. 단, JSONPλŠ” GET μš”μ²­λ§Œ κ°€λŠ₯ν•˜λ©° λ³΄μ•ˆμƒμ˜ μ΄μŠˆκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

<script>
  function handleData(data) {
    // 데이터 처리 둜직
  }
</script>
<script src="http://example.com/api/data?callback=handleData"></script>

3.3 ν”„λ‘μ‹œ μ„œλ²„ μ‚¬μš©

ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 직접 μš”μ²­μ„ λ³΄λ‚΄λŠ” λŒ€μ‹  λ™μΌν•œ λ„λ©”μΈμ˜ μ„œλ²„μ— μš”μ²­μ„ 보내고, μ„œλ²„μ—μ„œ λ‹€λ₯Έ 좜처둜의 μš”μ²­μ„ λŒ€μ‹  λ³΄λ‚΄λŠ” 방법을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. CORS와 λ³΄μ•ˆ

CORSλŠ” ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ 이루어지기 λ•Œλ¬Έμ— μ™„μ „ν•œ λ³΄μ•ˆμ„ μ œκ³΅ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ€‘μš”ν•œ λ°μ΄ν„°μ˜ 경우 μ„œλ²„ μΈ‘μ—μ„œλ„ μ μ ˆν•œ λ³΄μ•ˆ 쑰치λ₯Ό μ·¨ν•΄μ•Ό ν•©λ‹ˆλ‹€.

5. CORS 였λ₯˜ 해결을 μœ„ν•œ Best Practice

CORS 였λ₯˜λ₯Ό ν•΄κ²°ν•˜λŠ” κ°€μž₯ 쒋은 방법은 μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ

κ°„μ˜ μ†Œν†΅μ„ μ›ν™œνžˆ ν•˜κΈ° μœ„ν•΄ μ„œλ²„ 섀정을 μ •ν™•ν•˜κ²Œ μˆ˜ν–‰ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 좜처λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜κ±°λ‚˜ λͺ¨λ“  좜처λ₯Ό ν—ˆμš©ν•˜λŠ” λŒ€μ‹  ν•„μš”ν•œ μΆœμ²˜λ§Œμ„ ν—ˆμš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ CORS에 λŒ€ν•œ 기본적인 이해와 λŒ€μ‘ 방법을 톡해 μ›Ή κ°œλ°œμ—μ„œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό μ΅œμ†Œν™”ν•˜κ³  보닀 μ•ˆμ „ν•˜κ²Œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€