Posts πŸ’» HTTP #8: HTTP 쑰건뢀 μš”μ²­
Post
Cancel

πŸ’» HTTP #8: HTTP 쑰건뢀 μš”μ²­

HTTPλŠ” λ¦¬μ†ŒμŠ€λ“€μ„ 검사기 값을 μ΄μš©ν•΄ λΉ„κ΅ν•¨μœΌλ‘œμ¨ μ„±κ³΅ν–ˆμ„ 지라도 μš”μ²­μ˜ κ²°κ³Όκ°€ 변경될 수 μžˆλŠ” 쑰건뢀 μš”μ²­μ˜ 컨셉을 κ°–κ³  μžˆλ‹€. 쑰건뢀 μš”μ²­μ€ μΊμ‹œλ₯Ό κ°±μ‹ ν•  λ•Œ, λ‹€μš΄λ‘œλ“œλ₯Ό 이어할 λ•Œ, μ„œλ²„ μƒμ˜ λ¬Έμ„œλ₯Ό μ—…λ‘œλ“œ/μˆ˜μ •ν•  λ•Œ μœ μš©ν•˜λ‹€.

원칙

HTTP 쑰건뢀 μš”μ²­μ€ νŠΉμ • 헀더 값에 μ˜μ‘΄ν•˜μ—¬ κΈ°μ‘΄κ³ΌλŠ” λ‹€λ₯΄κ²Œ μ‹€ν–‰λ˜λŠ” μš”μ²­μ΄λ‹€. 이 헀더듀은 μ „μ œ 쑰건을 μ •μ˜ν•˜κ³  μžˆλŠ”λ°, μš”μ²­μ˜ κ²°κ³ΌλŠ” μ „μ œ 쑰건의 일치 여뢀에 따라 달라진닀.

쑰건뢀 μš”μ²­μ€ μš”μ²­ λ©”μ„œλ“œ 그리고 μ „μ œ 쑰건을 μœ„ν•΄ μ‚¬μš©λ˜λŠ” 헀더 집합에 μ˜ν•΄ μ •μ˜λœλ‹€.

  • GETκ³Ό 같은 safe λ©”μ„œλ“œμ˜ 경우, 였직 μ—°κ΄€λ˜μ–΄ μžˆλŠ” κ²½μš°μ—λ§Œ 쑰건뢀 μš”μ²­μ΄ νšŒμ‹ ν•˜λŠ”λ° μ‚¬μš©λ  수 μžˆμ–΄ λŒ€μ—­ν­μ„ μ•„λΌκ²Œ λœλ‹€.
  • PUT와 같은 unsafe λ©”μ„œλ“œλ“€μ˜ 경우, κ·Έ μš”μ²­μ˜ 원본 λ¬Έμ„œκ°€ μ„œλ²„μ— μ €μž₯λ˜μ–΄ μžˆλŠ” 것과 λ™μΌν•œ κ²½μš°μ—λ§Œ 쑰건뢀 μš”μ²­μ΄ λ¬Έμ„œ μ—…λ‘œλ“œμ— μ‚¬μš©λ  수 μžˆλ‹€.

검사기

λͺ¨λ“  쑰건뢀 μš”μ²­λ“€μ€ μ„œλ²„ 상에 μ €μž₯λ˜μ–΄ μžˆλŠ” λ¦¬μ†ŒμŠ€κ°€ νŠΉμ • 버전과 μΌμΉ˜ν•˜λŠ”μ§€λ₯Ό κ²€μ‚¬ν•˜λ €κ³  ν•œλ‹€. λ”°λΌμ„œ 쑰건뢀 μš”μ²­μ€ λ¦¬μ†ŒμŠ€μ˜ 버전을 λͺ…μ‹œν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. 전체 λ¦¬μ†ŒμŠ€λ₯Ό λ°”μ΄νŠΈ λŒ€ λ°”μ΄νŠΈλ‘œ λΉ„κ΅ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μš”μ²­μ€ 버전을 λœ»ν•˜λŠ” 값을 ν•¨κ»˜ μ „μ†‘ν•œλ‹€: 이 값을 검사기라고 λΆ€λ₯Έλ©° λ‹€μŒμ˜ 두 μ’…λ₯˜κ°€ μ‘΄μž¬ν•œλ‹€:

  • last-modified λ‚ μ§œ: λ¬Έμ„œμ˜ μ΅œμ’… μˆ˜μ • 일자
  • entity tag (etag): 각 버전을 κ³ μœ ν•˜κ²Œ λ‚˜νƒ€λ‚΄λŠ” 읽을 수 μ—†λŠ” λ¬Έμžμ—΄

동일 λ¦¬μ†ŒμŠ€μ˜ 버전 λΉ„κ΅λŠ” κ°•ν•œ 검사와 μ•½ν•œ κ²€μ‚¬λ‘œ λ‚˜λ‰˜μ–΄μ§„λ‹€. Last-Modified와 ETagλŠ” κ²€μ‚¬μ˜ 두 μ’…λ₯˜λ₯Ό λͺ¨λ‘ μ§€μ›ν•œλ‹€(검사기가 μ„œλ²„ μƒμ—μ„œ κ΅¬ν˜„λ˜λŠ” λ³΅μž‘λ„λŠ” 맀우 λ‹€μ–‘ν•˜λ‹€). HTTPλŠ” 기본적으둜 κ°•ν•œ 검사λ₯Ό μ‚¬μš©ν•˜λ©°, μ•½ν•œ 검사기가 μ‚¬μš©λ  수 μžˆλŠ” κ²½μš°μ—λŠ” W/λ₯Ό λΆ™μ—¬ 이λ₯Ό λͺ…μ‹œν•œλ‹€.

κ°•ν•œ 검사

κ°•ν•œ κ²€μ‚¬λŠ” λ¦¬μ†ŒμŠ€κ°€ λΉ„κ΅ν•˜λ €λŠ” λ‹€λ₯Έ λ¦¬μ†ŒμŠ€μ™€ λ°”μ΄νŠΈ λŒ€ λ°”μ΄νŠΈλ‘œ λ™μΌν•œμ§€λ₯Ό 보μž₯ν•œλ‹€. 예λ₯Ό λ“€μ–΄ λ‹€μš΄λ‘œλ“œλ₯Ό 이어할 λ•Œ μ‚¬μš©λœλ‹€. 쑰건뢀 헀더에 λŒ€ν•΄μ„œ 의무적이며, λ‹€λ₯Έ 헀더듀에 λŒ€ν•΄μ„œλŠ” 기본값이닀. κ°•ν•œ κ²€μ‚¬λŠ” 맀우 μ—„κ²©ν•˜κ³  μ„œλ²„ λ ˆλ²¨μ—μ„œ 보μž₯ν•˜κΈ°λŠ” 맀우 μ–΄λ €μšΈ μˆ˜λ„ μžˆμœΌλ‚˜, λ•Œλ‘œλŠ” μ„±λŠ₯의 손싀을 κ°μˆ˜ν•˜λ”λΌλ„ μ–΄λ–€ κ²½μš°μ—λ„ 데이터 무손싀을 보μž₯ν•œλ‹€. Last-Modifiedλ§Œμ„ μ΄μš©ν•΄ κ°•ν•œ 검사λ₯Ό ν•˜κΈ°λŠ” μ–΄λ ΅λ‹€. 보톡 λ¦¬μ†ŒμŠ€μ˜ MD5 ν•΄μ‹œ(ν˜Ήμ€ μœ λ„λ¬Ό)λ₯Ό 가지고 ETagλ₯Ό μ‚¬μš©ν•œλ‹€.

μ•½ν•œ 검사

μ•½ν•œ κ²€μ‚¬λŠ” κ°•ν•œ 검사와 달리 두 λ¦¬μ†ŒμŠ€κ°€ μœ μ‚¬ν•œ 컨텐츠λ₯Ό 가지고 있으면 두 λ¬Έμ„œμ˜ 버전이 λ™μΌν•˜λ‹€κ³  κ°„μ£Όν•œλ‹€. 예λ₯Ό λ“€μ–΄, 기쑴의 νŽ˜μ΄μ§€μ—μ„œ λ‚ μ§œ ν˜Ήμ€ κ΄‘κ³ λ§Œ λ‹€λ₯Έ νŽ˜μ΄μ§€κ°€ μžˆλ‹€κ³  κ°€μ •ν•  λ•Œ, κ·Έ νŽ˜μ΄μ§€λŠ” κ°•ν•œ κ²€μ‚¬μ—μ„œλŠ” λ‹€λ₯΄λ‹€κ³  νŒλ‹¨λ˜κ² μ§€λ§Œ, μ•½ν•œ κ²€μ‚¬μ—μ„œλŠ” 기쑴의 νŽ˜μ΄μ§€μ™€ λ™μΌν•˜λ‹€κ³  간주될 수 μžˆλ‹€. μ•½ν•œ 검사λ₯Ό λ§Œλ“€μ–΄λ‚΄λŠ” etag 체계λ₯Ό μ„Έμš°λŠ” 것은 νŽ˜μ΄μ§€μ˜ μš”μ†Œλ“€μ˜ μ€‘μš”μ„± 인지λ₯Ό λŒμ–΄λ“€μ΄λŠ” μˆœκ°„λΆ€ν„° λ³΅μž‘ν•΄μ§ˆ 수 μžˆμ§€λ§Œ, 캐싱 μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ”λ° μœ μš©ν•˜λ‹€.

쑰건뢀 헀더

쑰건뢀 ν—€λ”λŠ” 쑰건뢀 μš”μ²­μ„ μ΄λŒμ–΄ λ‚Έλ‹€.

  • If-Match: 원격지 λ¦¬μ†ŒμŠ€μ˜ ETagκ°€ 이 헀더에 λ‚˜μ—΄λœ 것과 μΌμΉ˜ν•œλ‹€λ©΄ 성곡
  • If-None-Match
  • If-Modified-Since: μ›κ²©μ§€μ˜ λ¦¬μ†ŒμŠ€μ˜ Last-Modified λ‚ μ§œκ°€ 이 헀더 내에 주어진 것보닀 μ’€ 더 졜근인 경우 성곡
  • If-Unmodified-Since
  • If-Range: ν•˜λ‚˜μ˜ 단일 etag ν˜Ήμ€ ν•˜λ‚˜μ˜ λ‚ μ§œλ§Œμ„ κ°€μ§ˆ 수 μžˆλ‹€. μ‹€νŒ¨ν•˜λ©΄ λ²”μœ„ μš”μ²­μ΄ μ‹€νŒ¨ν•˜κ³ , 206 Partial Content 응닡 λŒ€μ‹  200 OKκ°€ μ™„μ „ν•œ λ¦¬μ†ŒμŠ€μ™€ ν•¨κ»˜ 전솑될 것이닀.

유슀 μΌ€μ΄μŠ€

μΊμ‹œ κ°±μ‹ 

  1. μΊμ‹œκ°€ λΉ„μ–΄ μžˆκ±°λ‚˜ μ—†λŠ” 경우, μš”μ²­λœ λ¦¬μ†ŒμŠ€λŠ” 200 OK의 μƒνƒœλ‘œ νšŒμ‹ λœλ‹€. λ¦¬μ†ŒμŠ€μ™€ ν•¨κ»˜, 검사기가 헀더 내에 μ „μ†‘λ©λ‹ˆλ‹€. κ²€μ‚¬κΈ°λŠ” ν•΄λ‹Ή λ¦¬μ†ŒμŠ€μ™€ ν•¨κ»˜ μΊμ‹œλ˜κ³ , μΊμ‹œκ°€ μ‹ μ„ ν•˜μ§€ μ•Šκ²Œ λ˜μ—ˆμ„ λ•Œ 쑰건뢀 μš”μ²­μ„ λ§Œλ“€μ–΄ λ‚΄λŠ” 데 μ‚¬μš©λ  것이닀.
  2. μΊμ‹œκ°€ μ‹ μ„ ν•œ λ™μ•ˆμ—λŠ”, μ–΄λ–€ μš”μ²­λ„ λ°œκΈ‰λ˜μ§€ μ•ŠλŠ”λ‹€.
  3. μΊμ‹œκ°€ μ‹ μ„ ν•˜μ§€ μ•Šκ²Œ 되면, ν΄λΌμ΄μ–ΈνŠΈλŠ” μΊμ‹œλœ 값을 직접 μ‚¬μš©ν•˜μ§€ μ•Šκ³ , If-Modified-Since와 If-Match ν—€λ”μ˜ νŒŒλΌλ―Έν„°λ‘œ μ‚¬μš©λ˜λŠ” 검사기값을 μ΄μš©ν•΄ 쑰건뢀 μš”μ²­μ„ μ „μ†‘ν•œλ‹€.
    1. λ¦¬μ†ŒμŠ€κ°€ λ³€κ²½λ˜μ§€ μ•Šμ•˜λ‹€λ©΄, μ„œλ²„λŠ” 304 Not Modified 응닡을 νšŒμ‹ ν•˜κ³ , μ΄λŠ” μΊμ‹œλ₯Ό λ‹€μ‹œ μ‹ μ„ ν•œ κ²ƒμœΌλ‘œ λ§Œλ“€μ–΄μ£Όλ©°, ν΄λΌμ΄μ–ΈνŠΈλŠ” μΊμ‹œλœ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜κ²Œ λœλ‹€. 좔가적인 응닡/μš”μ²­ 왕볡이 μ΄λ£¨μ–΄μ§€μ§€λ§Œ, 연결을 톡해 λ‹€μ‹œ 전체 λ¦¬μ†ŒμŠ€λ₯Ό λ°›λŠ” κ²ƒλ³΄λ‹€λŠ” νš¨μœ¨μ μ΄λ‹€.With a stale cache, the conditional request is sent. The server can determine if the resource changed, and, as in this case, decide not to send it again as it is the same.
    2. λ¦¬μ†ŒμŠ€κ°€ λ³€κ²½λ˜μ—ˆλ‹€λ©΄, μ„œλ²„λŠ” λ¦¬μ†ŒμŠ€μ˜ μƒˆλ‘œμš΄ 버전과 ν•¨κ»˜, 200 OK 응닡을 νšŒμ‹ ν•œλ‹€.

In the case where the resource was changed, it is sent back as if the request wasn't conditional.

이 λ©”μ»€λ‹ˆμ¦˜μ—μ„œλŠ” λͺ¨λ“  λΈŒλΌμš°μ €κ°€ μΊμ‹œλ₯Ό κ΄€λ¦¬ν•˜κ³  있고, 쑰건뢀 μš”μ²­μ„ 보내, μ›Ή κ°œλ°œμžλŠ” μΆ”κ°€μ‘°μΉ˜λ₯Ό μ·¨ν•  ν•„μš”κ°€ μ—†λ‹€.

λΆ€λΆ„ λ‹€μš΄λ‘œλ“œμ˜ 톡합

νŒŒμΌλ“€μ˜ 뢀뢄적인 λ‹€μš΄λ‘œλ“œλŠ” 이전 λ™μž‘μ„ κ³„μ†ν•˜κ²Œ μ΄μ–΄μ£ΌλŠ” HTTP의 κΈ°λŠ₯으둜, 이미 받아놓은 정보λ₯Ό μœ μ§€ν•¨μœΌλ‘œμ¨ λŒ€μ—­ν­κ³Ό μ‹œκ°„μ„ μ ˆμ•½ν•΄μ€€λ‹€. 뢀뢄적인 λ‹€μš΄λ‘œλ“œλ₯Ό μ§€μ›ν•˜λŠ” μ„œλ²„λŠ” Accept-Ranges 헀더λ₯Ό λ³΄λƒ„μœΌλ‘œμ¨ 이λ₯Ό μ•Œλ¦°λ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” 아직 전솑받지 λͺ»ν•œ λ²”μœ„μ™€ ν•¨κ»˜ Ranges을 μ „μ†‘ν•˜μ—¬ λ‹€μš΄λ‘œλ“œλ₯Ό μ΄μ–΄λ‚˜κ°ˆ 수 μžˆλ‹€.

The client resumes the requests by indicating the range he needs and preconditions checking the validators of the partially obtained request.

이 원칙은 κ°„λ‹¨ν•˜μ§€λ§Œ ν•œ 가지 문제점이 μžˆλ‹€: λ‹€μš΄λ‘œλ“œλœ λ¦¬μ†ŒμŠ€κ°€ 두 λ‹€μš΄λ‘œλ“œ 사이에 μˆ˜μ •λ  경우, μˆ˜μ‹ λ°›λ˜ λ²”μœ„λŠ” λ¦¬μ†ŒμŠ€μ˜ 두 개의 μ„œλ‘œ λ‹€λ₯Έ 버전과 μƒμ‘ν•˜κ²Œ 될 것이며 μ΅œμ’…μ μΈ λ¬Έμ„œλŠ” μ˜€μ—Όλ  것이닀.

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 쑰건뢀 μš”μ²­μ΄ μ‚¬μš©λ˜λŠ”λ°, 두 가지 방법이 μžˆλ‹€.

  1. If-Modified-Since와 If-Match 헀더λ₯Ό μ‚¬μš©ν•˜λŠ” 방법: μ „μ œ 쑰건이 μ‹€νŒ¨ν•  경우 μ„œλ²„λŠ” 였λ₯˜λ₯Ό λ°˜ν™˜ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈλŠ” λ‹€μš΄λ‘œλ“œλ₯Ό μ²˜μŒλΆ€ν„° λ‹€μ‹œ μ‹œμž‘ν•œλ‹€. 그러라 이 방법은 좔가적인 응닡/μš”μ²­ κ΅ν™˜μ„ ν•„μš”λ‘œ ν•˜κ³ , μ΄λŠ” μ„±λŠ₯ κ°μ†Œμ˜ 원인이 λœλ‹€.When the partially downloaded resource has been modified, the preconditions will fail and the resource will have to be downloaded again completely.
  2. HTTPλŠ” 이것을 ν”Όν•˜κΈ° μœ„ν•œ νŠΉλ³„ν•œ 헀더인 If-Rangeλ₯Ό 가지고 μžˆλ‹€. If-Rangeλ₯Ό μ‚¬μš©ν•  경우 λ¦¬μ†ŒμŠ€κ°€ λ³€κ²½λ˜μ—ˆμ„ λ•Œ 1번처럼 μ„œλ²„μ—μ„œ 였λ₯˜λ₯Ό λ°˜ν™˜ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ‹€μ‹œ λ¦¬μ†ŒμŠ€ μš”μ²­μ„ ν•˜λŠ” 과정이 μƒλž΅λœλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ λ³€κ²½ν•  μ‹œ λ°”λ‘œ μ²˜μŒλΆ€ν„° λ‹€μš΄λ‘œλ“œλ₯Ό μ‹œμž‘ν•œλ‹€. The If-Range headers allows the server to directly send back the complete resource if it has been modified, no need to send a 412 error and wait for the client to re-initiate the download.

μ΅œμ ν™”λœ 잠금으둜 μ—…λ°μ΄νŠΈ 손싀 문제 ν”Όν•˜κΈ°

PUT λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄ 원격 λ¬Έμ„œλ₯Ό κ°±μ‹ ν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” 원본 νŒŒμΌμ„ 읽어듀인 ν›„ 그것을 μˆ˜μ •ν•˜κ³  μ΅œμ’…μ μœΌλ‘œ μ„œλ²„λ‘œ μˆ˜μ •λœ νŒŒμΌμ„ 내보낸닀.

λ¬Έμ œλŠ” ν•˜λ‚˜μ˜ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ¦¬μ†ŒμŠ€μ˜ μƒˆλ‘œμš΄ 볡사본을 μ§€μ—­μ μœΌλ‘œ μˆ˜μ •ν•˜κ³  μžˆλŠ” λ™μ•ˆμ—λ„, λ‘λ²ˆμ§Έ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ™μΌν•œ λ¦¬μ†ŒμŠ€λ₯Ό λ‚΄λ €λ°›κ³  μžμ‹ μ˜ μ˜μ—­ λ‚΄μ—μ„œ λ™μΌν•œ μž‘μ—…μ„ ν•  수 μžˆλ‹€. μ–΄λ–€ ν΄λΌμ΄μ–ΈνŠΈμ˜ λ³€κ²½ 사항이 μœ μ§€λ  μ§€λŠ” μ»€λ°‹ν•˜λŠ” μ‹œμ , ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ μ„±λŠ₯, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ¬Έμ„œλ₯Ό μˆ˜μ •ν•˜λŠ” 속도에 μ˜ν•΄μ„œλ„ 달라진닀. μ€‘μš”ν•œ 것은 받아듀여진 ν΄λΌμ΄μ–ΈνŠΈμ˜ λ³€κ²½ μ‚¬ν•­μœΌλ‘œ λͺ¨λ‘ λ³€κ²½λœλ‹€λŠ” 것이닀. 이것을 race condition(κ²½μŸμƒνƒœ)라고 ν•˜λ©° κ°μ§€ν•˜κ³  λ””λ²„κΉ…ν•˜κΈ° μ–΄λ €μš΄ λΆˆν™•μ‹€ν•œ λ™μž‘μ„ μœ λ°œν•œλ‹€.

When several clients update the same resource in parallel, we are facing a race condition: the slowest win, and the others don't even know they lost. Problematic!

두 ν΄λΌμ΄μ–ΈνŠΈ 쀑 ν•˜λ‚˜λ₯Ό λΆˆνŽΈν•˜κ²Œ λ§Œλ“€μ§€ μ•Šκ³ λŠ” 이λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” 방법은 μ—†λ‹€. λ‹€λ§Œ μ—…λ°μ΄νŠΈ 손싀과 경쟁 μƒνƒœλŠ” ν”Όν•  μˆ˜λŠ” μžˆλ‹€. 쑰건뢀 μš”μ²­μ€ μ΅œμ ν™” 잠금 μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. 잠금 λ©”μ»€λ‹ˆμ¦˜μ€ ν΄λΌμ΄μ–ΈνŠΈλ“€μ΄ λ¦¬μ†ŒμŠ€μ˜ 볡사본듀을 κ°–κ³  λ‘œμ»¬μ—μ„œ 그것을 μˆ˜μ •ν•˜λ©° 첫번째 ν΄λΌμ΄μ–ΈνŠΈκ°€ κ·Έ μˆ˜μ •λœ λ‚΄μš©μ„ μ„±κ³΅μ μœΌλ‘œ μ œμΆœν•˜κ³  λ‚˜μ„œ 이전 버전이 된 λ¦¬μ†ŒμŠ€κ°€ κ±°μ ˆλ˜λ„λ‘ ν•˜μ—¬ λͺ¨λ“  μ—…λ°μ΄νŠΈκ°€ 순차적으둜 μ΄λ£¨μ–΄μ§ˆ 수 μžˆλ„λ‘ ν•˜μ—¬ λ™μ‹œμ„±μ„ μ œμ–΄ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€.

Conditional requests allow to implement optimistic locking: now the quickest wins, and the others get an error.

이 λ©”μ»€λ‹ˆμ¦˜μ€ If-Matchλ‚˜ If-Unmodified-Since 헀더λ₯Ό μ‚¬μš©ν•΄ κ΅¬ν˜„ν•œλ‹€. etagκ°€ 원본 파일과 μΌμΉ˜ν•˜μ§€ μ•Šκ±°λ‚˜ ν˜Ήμ€ νŒŒμΌμ„ μˆ˜μ‹ ν•œ 이후에 파일이 μˆ˜μ •λœ 경우, ν•΄λ‹Ή λ³€κ²½ 사항은 412 Precondition Failed 였λ₯˜μ™€ ν•¨κ»˜ 거절될 것이닀. 이후 ν˜„μž¬ κ°€μž₯ μ΅œμ‹ μ˜ λ²„μ „μœΌλ‘œλΆ€ν„° λ‹€μ‹œ μ‹œμž‘ν•˜λ„λ‘ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ•Œλ €μ£Όκ±°λ‚˜ β€œdiff”λ₯Ό 보여주고 λ³€κ²½λœ λ‚΄μš©μ„ μœ μ§€ν•˜λ„λ‘ 선택할 수 있게 도움을 쀄 수 μžˆλ‹€.

diff: 두 개의 파일 κ°„ 차이에 λŒ€ν•œ 정보λ₯Ό 좜λ ₯ν•˜λŠ” 파일 비ꡐ μœ ν‹Έλ¦¬ν‹°μ΄λ‹€. 일반적으둜 ν•˜λ‚˜μ˜ 파일 버전과 λ™μΌν•œ 파일의 λ‹€λ₯Έ 버전 κ°„μ˜ λ³€κ²½ 사항을 λ³΄μ—¬μ£ΌλŠ” 데 쓰인닀. diffλŠ” λ¬Έμ„œ 파일의 쀄 사이 변경사항을 보여쀀닀.

diff

λ¦¬μ†ŒμŠ€μ˜ 첫번째 μ—…λ‘œλ“œ 닀루기

두 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ—…λ°μ΄νŠΈλ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•˜λ €κ³  ν•˜λŠ” κ²½μš°λ„ κ²½μŸμƒνƒœμ΄λ‹€. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 쑰건뢀 μš”μ²­μ„ μ‚¬μš©ν•  수 μžˆλ‹€: μ–΄λ–€ etag든지 λ‚˜νƒ€λ‚΄λŠ” '*'라고 ν•˜λŠ” νŠΉλ³„ν•œ 값을 If-None-Match에 μΆ”κ°€ν•˜μ—¬, λ¦¬μ†ŒμŠ€κ°€ 이전에 μ‘΄μž¬ν•˜μ§€ μ•Šμ€ κ²½μš°μ—λ§Œ μš”μ²­μ΄ μ„±κ³΅ν•˜κ²Œ ν•  수 μžˆλ‹€.

Like for a regular upload, the first upload of a resource is subject to a race condition: If-None-Match can prevent it.

This post is licensed under CC BY 4.0 by the author.

μ½”μ–΄ μžλ°”μŠ€ν¬λ¦½νŠΈ #2.10: if와 '?'λ₯Ό μ‚¬μš©ν•œ 쑰건 처리

:book: μžλ°”μ˜ 정석 #8: μ˜ˆμ™Έμ²˜λ¦¬

Loading comments from Disqus ...