ν μ¬μ΄νΈμμ μ£Όμκ° λ€λ₯Έ μλ²λ‘ μμ²μ 보λΌλ μ΄ CORSμ μν μλ¬κ° λ°μνκ² λλ€. νμ§λ§ μ κΈ°νκ²λ κ°μ μμ²μ΄λλΌλ μ΄λ€ λΆλΆμμλ λκ³ λ λ€λ₯Έ λΆλΆμμλ μλλ κ²½μ°κ° μλλ° μ΄λ CORSλ‘ μμ²μ λ§λ κ²μ λΈλΌμ°μ μ μμμ΄λ€.
μλλ©΄ μ°λ¦¬μ λΈλΌμ°μ λ μ°λ¦¬λ€μ΄ λ°©λ¬Ένλ μ¬μ΄νΈλ₯Ό λ―Ώμ§ λͺ»νκΈ° λλ¬Έμ΄λ€.
π CORS(Cross-Origin Resource Sharing)
κ΅μ°¨ μΆμ² 리μμ€ κ³΅μ (Cross-Origin Resource Sharing, CORS)λ μλ²κ° λΈλΌμ°μ κ° λ¦¬μμ€ λ‘λλ₯Ό νμ©ν΄μΌ νλ μμ²΄κ° μλ λ€λ₯Έ μΆμ² (λλ©μΈ, μ²΄κ³ λλ ν¬νΈ) λ₯Ό λνλΌ μ μλλ‘ νλ HTTP ν€λ κΈ°λ° λ©μ»€λμ¦μ λλ€ . CORSλ λν μλ²κ° μ€μ μμ²μ νμ©νλμ§ νμΈνκΈ° μν΄ λΈλΌμ°μ κ° κ΅μ°¨ μΆμ² 리μμ€λ₯Ό νΈμ€ν νλ μλ²μ “ν리νλΌμ΄νΈ” μμ²μ νλ λ©μ»€λμ¦μ μμ‘΄ν©λλ€. ν΄λΉ ν리νλΌμ΄νΈμμ λΈλΌμ°μ λ HTTP λ©μλλ₯Ό λνλ΄λ ν€λμ μ€μ μμ²μ μ¬μ©λ ν€λλ₯Ό 보λ λλ€.
MDNμμλ μμ κ°μ΄ CORSλ₯Ό μ€λͺ νλ€. μ¬μ€ μ΄λ κ² λ€μ΄μλ μμ§ ν¬κ² 무μ¨λ§μΈμ§ μλΏμ§ μμλ€. κ·Έλμ λ¨Όμ CORSκ° μ λ±μ₯νλμ§λΆν° μ°Ύμ보μλ€.
π CORSμ λ±μ₯ λ°°κ²½
λμ λΈλΌμ°μ μλ ν ν°λ±μ μ 보λ€μ΄ μΏ ν€μ ννλ‘ μ μ₯μ΄ λμ΄μλ€. λ§μ½ λ΄κ° μ μμ μΈ μ¬μ΄νΈμ μ μνμλ μ μμ μΈ μ¬μ΄νΈμμλ λλ₯Ό μν΄μ μ μμ μΈ μ¬μ΄νΈμ html, css, js νμΌ λ±μ 보λ΄μ£Όκ³ λ΄ λΈλΌμ°μ λ λμκ² λ³΄μ¬μ£ΌκΈ° μν΄μ μ½λλ€μ νμ±νκ³ ν ν°ννλ λ± λ°μ μ½λλ€μ΄ λμλλλ‘ ν ν λ° μ΄λ λ§μ½ μλ°μ€ν¬λ¦½νΈλ‘ λΈλΌμ°μ μ μ μ₯λ λ΄ μ 보λ₯Ό λΉΌλ΄μ ν΄λΉ μ¬μ΄νΈλ€λ‘ μ κ·Όν΄μ λ΄ κ°μΈμ 보λ₯Ό λΉΌμμ μ μμ§ μμκΉ?
λ€ννλ μ°λ¦¬μ λΈλΌμ°μ λ μ΄λ€ μ¬μ΄νΈμμ λ€λ₯Έ μ¬μ΄νΈλ‘ μμ²μ 보λ΄λ κ²μ κΈ°λ³Έμ μΌλ‘ λ§μμ€λ€. κ·Έλ μ§λ§ μΉ μνκ³κ° μ μ λ λ€μν΄μ§λ©΄μ μ¬λ¬ μλΉμ€λ€κ°μ λ³΄λ€ μμ λ‘κ² λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ νμκ° μκΈ°κ² λμλλ° λ€λ₯Έ μ¬μ΄νΈλ‘ μμ²μ 보λ΄μΌ νκΈ° λλ¬Έμ μ΄λ₯Ό νμ©νλλ‘ ν μ μλ CORSκ° νμν΄μ§κ² λμλ€.
π SOP (Same Origin Policy)
CORSλ μ΄λ€ μ¬μ΄νΈμμ λ€λ₯Έ μ¬μ΄νΈλ‘ μμ²μ 보λ΄λ κ²μ νμ©νλ κ²μ΄λ€. λ°λ©΄ SOPμ λμΌ μΆμ² μ μ± μΌλ‘μ κ°μ URLλΌλ¦¬λ§ APIλ±μ λ°μ΄ν° μ κ·Όμ΄ κ°λ₯νλλ‘ νλ μ μ± μ΄λ€.
λ΄κ° λ€λ₯Έ μΆμ²λ‘ μμ²(Cross-Origin μμ²)μ νκ² λλ κ²½μ° λΈλΌμ°μ μμλ μμ²μ originμ΄λΌκ³ Headerμ μΆκ°ν΄μ μμ²μ νλ€.
GET /HTTP/1.1
Host: www.jongbin.com
Origin: https://www.jongbin.com
μ΄λ¬ν μμ²μ λ°μ μλ²λ λ΅μ₯ ν€λμ μ§μ λμ΄ μλ Access-Control-Allow-Origin μ 보λ₯Ό 보λΈλ€.
Access-Control-Allow-Origin: www.jongbin.com
Access-Control-Allow-Origin: *
μ΄ν λΈλΌμ°μ λ μ΄ λμ λΉκ΅νλ€. originμμ λ³΄λΈ μΆμ²κ°μ΄ μλ²μ λ΅μ₯ ν€λμ μλ Access-Control-Allow-Originμ μ‘΄μ¬νλ€λ©΄ μμ ν μμ²μ΄λΌκ³ νλ¨νκ³ λ°μ΄ν°λ₯Ό 건λ€μ£Όκ² λλ€.
μ¬μ©μ μλ³ μ λ³΄κ° λ΄κΈ΄ μμ²μ νλ κ²½μ°μλ λ μ격νκ² μ΄λ£¨μ΄μ§λλ° κ·Έ λ°©μμλ λκ°μ§κ° μ‘΄μ¬νλ€.
1. Simple request
보λ΄λ μΈ‘μ μμ²μ μ΅μ μΌλ‘ credentals νλͺ©μ trueλ‘ ν΄μ€λ€.
λ°λ μΈ‘μμλ λͺ¨λ μ¬μ΄νΈλ₯Ό νμ©νλ μμΌλμΉ΄λ(*)μ μ¬μ©μ μμ νκ³ λ³΄λ΄λ μΈ‘μ μΆμ²λ₯Ό μ ννκ² λͺ μν΄μΌ νλ€.
Simple requestλ HTTP λ©μλκ° GET, POST, HEADμΈ μΌμ 쑰건μμ κ°λ₯ν λ°©μμ΄λ€.
2. Preflight
PUT, DELETE λ± λ°μ΄ν°λ₯Ό μ‘°μνλ λ€λ₯Έ μμ²λ€μ μμ²μ μ Preflight μμ²μ μ ννλλ° μ΄λ ν΄λΉ μμ²μ΄ μμ νμ§ νμΈνλ μμ²μ΄λ€. Preflight μμ²μ μλ΅μΌλ‘ νλ½μ΄ λ¨μ΄μ§λ©΄ κ·ΈλμμΌ λ³Έ μμ²μ΄ μ μ‘μ΄ λλ€.
Simple requestμ κ°μ₯ ν° μ°¨μ΄μ μ Preflightμ μμ²μ νλλ°λ νλ½μ λ°μμΌ μμ²μ ν μ μλ€λ μ μ΄ μλ€.
κ²°κ΅ CORSλ λ€λ₯Έ μΆμ²(μΉμ¬μ΄νΈ)κ°μ 리μμ€(λ°μ΄ν°) 곡μ κ° κ°λ₯νλλ‘ νλ€. μμ²μ λ°λ λ°±μλμμ νλ½ν λ€λ₯Έ μΆμ²λ€μ λͺ μ(Access-Control-Allow-Origin)ν΄λλ©΄ 리μμ€ κ³΅μ κ° κ°λ₯νλλ‘ λ§λ€μ΄μ§ λ©μ»€λμ¦μ΄λ€.
π Express CORS
React + Expressλ‘ νλ‘μ νΈλ₯Ό μ§ννλ©΄μ CORSμλ¬λ₯Ό λ§μ£Όνλλ° cors λΌμ΄λΈλ¬λ¦¬λ₯Ό μ΄μ©ν΄μ λ€μκ³Ό κ°μ΄ ν΄κ²°νλ€.
const app: Express = express();
app.use(
cors({
origin: true, // *λ κ°μ μλ―Έ
credentials: true,
})
);
μ μ½λλ λͺ¨λ λλ©μΈμ λν΄μ νμ©νλ μ½λμΈλ° λ§μ½ νΉμ λλ©μΈμ λν΄μ νμ©νλ €λ©΄ originμ νμ©νλ €λ λλ©μΈμ μ λ ₯ν΄μ£Όλ©΄ λλ€.
credentials: true λΌλ μ΅μ μ λ€λ₯Έ λλ©μΈ κ°μ μΏ ν€ κ³΅μ λ₯Ό νλ½νλ μ΅μ μ΄λ€. μ΄μ κ΄λ ¨ν΄μ νλ‘ λλ¨μμ μΏ κΈ°λ₯Ό μ μ‘ν΄μΌνλ κ²½μ° withCredentials: trueλ₯Ό μ΅μ μΌλ‘ λͺ μν΄μ€μΌ νλ€.
const { status } = await axios({
method: λ©μλ λͺ
,
url: API μ£Όμ,
data: {보λ΄μ€ κ°},
withCredentials: true,
});
'Web' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Web] Socket, WebSocket (μμΌκ³Ό μΉμμΌ) (2) | 2023.03.14 |
---|---|
[Web] λΈλΌμ°μ μμ λλ©μΈμ μ λ ₯νλ©΄ μΌμ΄λλ μΌ (0) | 2023.03.02 |
[Web] JWT (0) | 2023.02.25 |
[Web] Webpack (0) | 2023.02.22 |