2021. 8. 22. 08:00γFront-End μμ μ€/κΈ°ν μ°Έκ³ μλ£
μλ νμΈμ? μ£Όλνλ μ λλ€.
λ³Έ λ΄μ©μ μ£Όλνλμ΄ Web κ°λ° νλ‘μ νΈλ₯Ό νλ©΄μ λμ νλ κΈ°μ λ€μ λν λ΄μ©μ μ 리νλ κ³³ μ λλ€!
μ΄ κΈμ ν¨κ» νλ‘μ νΈ νλ Front End κΏλ무 Crewκ° μμ±ν κ²μ΄μμ.
μ£Όλνλμ Back End κ°λ°μ 맑μμλ΅λλ€!
ν΄λΌμ΄μΈνΈλ 리μ‘νΈ, μλ²λ μ€νλ§ λΆνΈλ₯Ό μ¬μ©νμ¬ κ°λ°μ μ§ννμμ΅λλ€.
μμ κ°μ κ°λ° μν©μμ Axiosλ₯Ό μ¬μ©ν API ν΅μ μ μ§ννλ € νμ CORS μλ¬κ° λ°μνκ³ μ΄λ₯Ό ν΄κ²°ν κ³Όμ μ μκ° νλ € νλ κ²μ΄μμ.
CORS μλ¬λ μ λ°μνλκ°?
νλ‘ νΈμλ κ°λ°μ νλ©΄μ μλ²μ ν΅μ μ μ§νν λ μμ κ°μ μλ¬λ₯Ό μ¬μ¬μΉ μκ² λ°κ²¬νμ€ μ μμ΅λλ€. ν΄λΉ μλ¬λ CORS μ μ± μ μλ°ν λ λ°μνκ² λλλ°μ.
λ¨Όμ CORSμ κΈ°λ³Έμ μΈ λ΄μ©μ λν΄μ μ€λͺ νκ² μ΅λλ€.
CORS
CORSλ μΆκ° HTTP ν€λλ₯Ό μ¬μ©νμ¬, ν μΆμ²μμ μ€ν μ€μΈ μΉ μ ν리μΌμ΄μ μ΄ λ€λ₯Έ μΆμ²μ μ νν μμμ μ κ·Όν μ μλ κΆνμ λΆμ¬νλλ‘ λΈλΌμ°μ μ μλ €μ£Όλ 체μ μ λλ€.
μΉ μ ν리μΌμ΄μ μ 리μμ€κ° μμ μ μΆμ²(λλ©μΈ, νλ‘ν μ½, ν¬νΈ)μ λ€λ₯Ό λ κ΅μ°¨ μΆμ² HTTP μμ²μ μ€ννκ² λ©λλ€.
λμΌ μΆμ² μ μ±
보μ μμ μ΄μ λ‘, λΈλΌμ°μ λ μ€ν¬λ¦½νΈμμ μμν κ΅μ°¨ μΆμ² HTTP μμ²μ μ νν©λλ€. μ΄λ λμΌ μΆμ² μ μ± λλ¬ΈμΈλ°μ.
μ΄λ€ μΆμ²μμ λΆλ¬μ¨ λ¬Έμλ μ€ν¬λ¦½νΈκ° λ€λ₯Έ μΆμ²μμ κ°μ Έμ¨ 리μμ€μ μνΈμμ©νλ κ²μ μ ννλ μ€μν 보μ λ°©μμ λλ€.
ν΄λΉ μ μ± μ ν΅ν΄ μ μ¬μ μΌλ‘ ν΄λ‘μΈ μ μλ λ¬Έμλ₯Ό λΆλ¦¬ν¨μΌλ‘μ¨ κ³΅κ²©λ°μ μ μλ κ²½λ‘λ₯Ό μ€μΌ μ μκ² μ£ ?
μλ¬ μμΈ
μ¦, ν΄λΌμ΄μΈνΈμ μλ²μ μΆμ²κ° λμΌνμ§ μμκΈ° λλ¬Έμ ν΄λΉ μλ¬κ° λ°μν κ²μ λλ€.
μ ν¬λ κ°λ°νκ²½μμ ν¬νΈλ₯Ό λ°λ‘ μ€μ νμ§ μμκΈ° λλ¬Έμ ν΄λΌμ΄μΈνΈμ μλ²λ κ°κ° κΈ°λ³Έ ν¬νΈμΈ 3000 κ³Ό 8080μ μ¬μ©νκ³ μμκ³ μ΄λ λμΌ μΆμ² μ μ± μ λΆν©νμ§ μμ΅λλ€.
ν΄κ²° λ°©λ²
CORS μ μ± μ νμΈν΄κ°λ©° μ ν¬λ μλ¬ λ°μ μ΄μ λ₯Ό κΉ¨λ¬μμ΅λλ€. μ΄μ μλ¬λ₯Ό ν΄κ²°ν΄μΌ λ μ°¨λ‘κ΅°μ.
μ ν¬λ μλ¬λ₯Ό ν΄κ²°νκΈ° μν΄ λͺ κ°μ§μ λ°©λ²μ μ°Ύμ보μμ΅λλ€.
HTTP μλ΅ ν€λ
첫 λ²μ§Έλ‘ HTTP μλ΅ ν€λλ₯Ό μ€μ νλ λ°©λ²μ λλ€.
Axiosλ₯Ό μ¬μ©ν API ν΅μ μ κΈ°λ³Έ μ½λλ μλμ κ°μ΅λλ€.
axios.post('uri', { postData } )
.then((res) => {})
.catch((err) => {})
μμ μ½λμμ HTTP μλ΅ ν€λμ CORSλ₯Ό μ€μ ν΄λ³΄κ² μ΅λλ€.
axios.post('uri', { headers: {
'Access-Control-Allow-Origin': 'νμ©νκ³ μ νλ λλ©μΈ',
}, { postData } )
.then((res) => {})
.catch((err) => {})
μμ κ°μ λ°©λ²μΌλ‘ CORS μλ¬λ₯Ό ν΄κ²°ν μλ μμμ΅λλ€. νμ§λ§ μ ν¬λ API ν΅μ μ ν λλ§λ€ λ§€λ² axios νλΌλ―Έν°λ‘ HTTP μλ΅ ν€λμ μ€μ μ μμ±ν΄μΌ λλ€λ μ μ μ’μ§ μκ² μκ°νμΌλ©° μ΄λ₯Ό λΆλ¦¬ν΄ κ΄λ¦¬ν λ°©λ²μ μ°Ύμλ³΄κ² λμμ΅λλ€.
νλ‘μ(Proxy) μ€μ
λ λ²μ§Έλ‘ μ°Ύμ λ°©λ²μ νλ‘μ μ€μ μ λλ€.
νλ‘μ
νλ‘μλ νλ‘ν μ½μ μμ΄μ λ리 μλ΅ μ΄λΌλ κ°λ μΌλ‘ μ΄ν΄ν μ μμ΅λλ€.
νλ‘μ μλ²μ μν λ‘
- μΈν°λ· μΈ‘μ΄ μ μ μ μ€μ IPλ₯Ό μ μ μλλ‘ ν©λλ€.
- ν΄λΌμ΄μΈνΈμμ μλ²μ λ°μ΄ν°λ₯Ό λ³΄λΌ λ νλ‘μ μλ²μμ λ°μ΄ν°λ₯Ό λ°κΎΈκ³ μλ² μΈ‘μ μ λ¬ν μ μμ΅λλ€.
μ ν¬λ νλ‘μ μλ²λ₯Ό ν΅ν΄ CORS μλ¬μ μ¬μ΄ μ½λ μμ± λ° μ μ§ λ³΄μκ° κ°λ₯ν κ²μ΄λΌ μκ°νκ³ λ°λ‘ μ ν¬ κ°λ° νκ²½μ μ μ©νκΈ°λ‘ νμ΅λλ€!
proxy: { '/api/': {
target: '<http://localhost:8080>',
changeOrigin: true,
},
},
μ ν¬λ create-react-appμ μ¬μ©νμ§ μκ³ μΉν© μ€μ μ νκΈ° λλ¬Έμ proxy μ€μ μ μμ κ°μ΄ μ§ννμ΅λλ€.
μλ²μμ λͺ¨λ REST APIμ URIμ€κ³λ₯Ό /apiλ‘ μμνκ²λ λ³κ²½νμκ³ , ν΄λΌμ΄μΈνΈμμ /apiλ‘ μμνλ λͺ¨λ ν΅μ μ νλ‘μ μ€μ μ ν΄μ£Όμμ΅λλ€.
κ²°λ‘
CORS μλ¬λ₯Ό ν΄κ²°νκΈ° μν΄ λ°©λ²μ μ°Ύμλ΄λ©΄μ μ¬λ¬κ°μ§ λ°©λ²λ μκ² λμκ³ κ²°κ³Όμ μΌλ‘ νλ‘μλ₯Ό μ¬μ©ν΄ κΉλν μ½λλ₯Ό μμ±ν μ μμ΄ λ§μ‘±λκ° λμ μμ μ΄μμ΅λλ€.
첫 λ²μ§Έλ‘ μλ²μ API ν΅μ μ μ§νν λ μ΄λ©μΌ μΈμ¦ APIλ₯Ό μ§ννλ©΄μ μλ²μ μΏ ν€ μ λ¬μ΄ μ λλ‘ μ΄λ£¨μ΄μ§μ§ μλ νμμ΄ λ°μν΄μ μκ²λ μ΄μμλλ°μ. (ν΄λΉ μΏ ν€ μ μ± λ λ€λ£° μμ μ λλ€! π§)
λ§μ½ get λ©μλλ₯Ό λ¨Όμ μμ νλ€λ©΄ κ°λ° μ€κ°μ ν΄λΉ μ΄μλ₯Ό μκ² λμμν λ° (맀λ λ¨Όμ λ§λκ² λ«λ€κ³ ,,, π ) 미리 μμμ λ€νμ΄λΌκ³ μκ°ν©λλ€.
'Front-End μμ μ€ > κΈ°ν μ°Έκ³ μλ£' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[FrontEnd] html Tag μ 리 (0) | 2022.03.14 |
---|---|
[CSS] background, background-size (0) | 2022.03.14 |
[CSS] Color μμ± (0) | 2022.03.13 |
[CSS] CSS μ 리 (0) | 2022.03.13 |
[λμ κΈ°μ !] μ κ·Ό κΆν μ²λ¦¬ (0) | 2021.08.21 |