λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
πŸ’» Computer Science/- Network

[HTTP] OPTIONS 헀더와 Preflight 그리고 CORS

by Wonit 2021. 8. 14.

 

OPTIONS λŠ” RFC 7231 에 λͺ…μ‹œλœ HTTP의 μ—¬λŸ¬ λ©”μ„œλ“œ 쀑 ν•˜λ‚˜μ΄λ‹€.

 

 

OPTIONS λŠ” μ‹€μ œλ‘œ μš°λ¦¬κ°€ ν”„λ ˆμž„μ›Œν¬λ‚˜ 라이브러리λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ 직접 μ‚¬μš©ν•  일은 λ“œλ¬Όμ§€λ§Œ ν˜„λŒ€μ˜ Front Back 을 λ‚˜λˆ„λŠ” 개발 νλ¦„μ—μ„œλŠ” κΌ­ μ•Œμ•„μ•Ό ν•  κ°œλ…μ€‘ ν•˜λ‚˜μ΄λ‹€.

 

이 Options 에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.

 

HTTP의 OPTIONS Mthod

 

Http OPTIONS λ©”μ„œλ“œλŠ” target λ¦¬μ†ŒμŠ€μ™€ ν˜Ήμ€ μ„œλ²„μ™€ ν†΅μ‹ ν•˜κΈ° μœ„ν•œ 톡신 μ˜΅μ…˜μ„ 확인할 λ•Œ μ‚¬μš©λœλ‹€.

 

즉, ν•΄λ‹Ή νƒ€κ²Ÿ μ„œλ²„λ‚˜ λ¦¬μ†ŒμŠ€κ°€ μ–΄λ–€ method, header, content type λ₯Ό μ§€μ›ν•˜λŠ”μ§€ μ•Œ 수 μžˆλ‹€.

 

주둜 Browser 의 Js κ°€ λ³΄λ‚΄λŠ” Fetch, Axios μš”μ²­μ˜ Preflight μ—μ„œ μ‚¬μš©λ˜κ³€ ν•œλ‹€.

 

그럼 μ™œ OPTIONS λ₯Ό μ‚¬μš©ν• κΉŒ?

 

이λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” Preflight 에 λŒ€ν•΄μ„œ μ•Œμ•Όμ•Ό ν•œλ‹€.

 

Preflight λž€?

 

Preflight 은 더 효율적인 톡신을 μœ„ν•¨κ³Ό 관련이 κΉŠλ‹€.

 

λ§Œμ•½ μš°λ¦¬κ°€ μ—„μ²­λ‚œ 데이터λ₯Ό μ„œλ²„λ‘œ 보낸닀고 κ°€μ •ν•˜μž.

 

κ·Έλž˜μ„œ Front μ—μ„œ μ—¬λŸ¬ 처리λ₯Ό ν•œ λ’€, μ—΄μ‹¬νžˆ Body 에 데이터λ₯Ό νŒŒμ‹±ν•˜κ³  λ‹΄μ•˜λ‹€.

 

ν•˜μ§€λ§Œ μ„œλ²„κ°€ POST μš”μ²­μ„ ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄..?

 

그럼 데이터λ₯Ό Network Byte Order 둜 λ°”κΎΈλŠ” λ“± μ—¬λŸ¬ 과정을 거친 것듀이 ν—ˆλ¬΄ν•˜κ²Œ 사라져 λ²„λ¦¬κ²Œ λœλ‹€..

 

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œ μ„œλ²„μ—μ„œ μ–΄λ–€ λ©”μ„œλ“œμ™€ μ–΄λ–€ header λ₯Ό ν—ˆμš©ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” 과정이 ν•„μš”ν•˜κ²Œ λ˜μ—ˆκ³ , κ·Έ 과정을 λ°”λ‘œ Preflight μ—μ„œ μˆ˜ν–‰ν•œλ‹€.

 

그럼 κ²°κ΅­ 흐름은?

 

μš°λ¦¬κ°€ νŠΉμ • Http Method 둜 μš”μ²­μ„ λ³΄λ‚΄κ²Œ λœλ‹€λ©΄ ν•΄λ‹Ή μ„œλ²„λ‘œ OPTIONS λ₯Ό 미리 보내보고 ν•΄λ‹Ή 응닡을 ν™•μΈν•œ ν›„, μš°λ¦¬κ°€ 보낸 Http Method κ°€ μ§€μ›ν•˜λ©΄ μ‹€μ œ μš”μ²­μ΄ μ΄λ€„μ§€κ²Œ λ˜λŠ” 것이닀.

 

이제 OPTIONS Method λ₯Ό μ™œ μ“°λŠ”μ§€ μ•Œ 수 있게 λ˜μ—ˆλ‹€.

 

더 깊게 OPTIONS 에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.

 

OPTIONS Method λž€?

 

μ•žμ˜ Preflight μ—μ„œ OPTIONS κ°€ μ‚¬μš©λœλ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€.

 

μ‹€μ œ OPTIONS μš”μ²­μ„ 봐보자.

 

OPTIONS λ₯Ό curl μš”μ²­μœΌλ‘œ λ³΄λ‚΄κ²Œ λœλ‹€λ©΄ μš°λ¦¬κ°€ μ˜ˆμƒν•˜κΈ°λ‘œλŠ” Headerλ‚˜ Content-Type, Allow Method 의 정보가 λ„˜μ–΄μ™€μ•Ό ν•œλ‹€.

 

$ curl -X OPTIONS https://some-server.com -i

 

λΌλŠ” μš”μ²­μ„ νŠΉμ € μ„œλ²„μ— λ³΄λƒˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž.

 

그럼 λ‹€μŒκ³Ό 같은 응닡을 받을 수 μžˆλ‹€.

 

HTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Expires: Thu, 20 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)
x-ec-custom-error: 1
Content-Length: 0

 

μ΄λŸ¬ν•œ 정보듀을 μ„œλ²„λ‘œλΆ€ν„° 확인을 ν•  수 있게 되고, μš°λ¦¬λŠ” Preflight λ₯Ό λΉ„λ‘―ν•œ μ—¬λŸ¬ μƒν™©μ—μ„œ 이λ₯Ό μ‚¬μš©ν•˜κ²Œ λ˜λŠ” 것이닀.

 

이 μ •λ³΄λŠ” CORS μ—μ„œλ„ μ‚¬μš©λ  수 μžˆλŠ”λ°, 잘 μ•Œλ‹€μ‹Άμ΄ CORS λŠ” λ¨Όμ € OPTIONS μš”μ²­μ„ 보낸 λ’€, ν•΄λ‹Ή 정보λ₯Ό ν† λŒ€λ‘œ ν†΅μ‹ μ˜ κ°€λŠ₯ μ—¬λΆ€λ₯Ό νŒŒμ•…ν•˜κ²Œ λœλ‹€.

 

CORS 에 λŒ€ν•œ μžμ„Έν•œ μ΄μ•ΌκΈ°λŠ” ν•΄λ‹Ή λΈ”λ‘œκ·Έ Cross Origin Resource Sharing μ΄λž€? μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λΈŒλΌμš°μ €λŠ” λ‹€μŒκ³Ό 같은 과정을 거치게 λœλ‹€.

 

 

  1. GET μš”μ²­μΈμ§€ POST μš”μ²­μΈμ§€ νŒŒμ•…ν•œλ‹€.
  2. Content-Type κ³Ό Custom HTTP Header λ₯Ό νŒŒμ•…ν•œλ‹€.
  3. OPTIONS μš”μ²­μ„ ν†΅ν•΄μ„œ μ„œλ²„κ°€ μ μ ˆν•œ Access-Control-* λ₯Ό κ°€μ‘ŒλŠ”μ§€ ν™•μΈν•œλ‹€.
  4. λ§Œμ•½ μ μ ˆν•œ Access-Control 을 κ°€μ‘Œλ‹€λ©΄ μ‹€μ œ XHR을 νŠΈλ¦¬κ±°ν•œλ‹€.
  5. μ μ ˆν•˜μ§€ λͺ»ν•œ Access-Control λ₯Ό κ°€μ‘Œλ‹€λ©΄ Error λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

 

λ§Œμ•½ μ„œλ²„μ—μ„œ Cross Origin 에 λŒ€ν•œ μ μ ˆν•œ Access Control 을 ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ Preflight κ³Όμ •μ—μ„œ Error λ₯Ό λ°œμƒμ‹œν‚€κ³  ν•΄λ‹Ή 톡신을 μˆ˜ν–‰ν•˜μ§€ μ•Šκ²Œ λœλ‹€.

 

κ·Έλž˜μ„œ CORS λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” Access Control 에 λŒ€ν•œ λͺ…μ‹œλ₯Ό ν•΄μ€˜μ•Ό ν•œλ‹€.

λŒ“κΈ€