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

CS/λ„€νŠΈμ›Œν¬

[λ„€νŠΈμ›Œν¬] HTTP Methods 차이점 정리

 

 

HTTP λ©”μ„œλ“œ

  • HTTP ν”„λ‘œν† μ½œμ—μ„œ μ‚¬μš©λ˜λŠ” μš”μ²­ λ©”μ„œλ“œλ‘œ, μžμ›μ— λŒ€ν•΄ μ„œλ²„κ°€ μˆ˜ν–‰ν•  λ™μž‘μ„ μ§€μ •ν•©λ‹ˆλ‹€.
  • 총 9κ°€μ§€κ°€ 있으며 REST APIλ₯Ό 섀계할 λ•Œ 주둜 μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œλŠ” 5κ°€μ§€μž…λ‹ˆλ‹€.

 

μ£Όμš” λ©”μ„œλ“œ 5κ°€μ§€

  • GET : μ„œλ²„λ‘œλΆ€ν„° μžμ›μ„ μš”μ²­ν•˜λŠ” λ™μž‘
  • POST : μ„œλ²„λ‘œ 데이터λ₯Ό μ „μ†‘ν•˜μ—¬ μžμ›μ„ μƒμ„±ν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈ ν•˜λŠ” λ™μž‘
  • PUT : μ„œλ²„μ— μžμ›μ„ μƒμ„±ν•˜κ±°λ‚˜ κΈ°μ‘΄ μžμ›μ„ λŒ€μ²΄ν•˜λŠ” λ™μž‘
  • PATCH : μ„œλ²„ μžμ›μ˜ μΌλΆ€λ§Œ μˆ˜μ •ν•˜λŠ” λ™μž‘
  • DELETE : μ„œλ²„μ—μ„œ μžμ›μ„ μ‚­μ œν•˜λŠ” λ™μž‘

 

GET vs POST

1. GET

  • λͺ©μ 
    • μ„œλ²„λ‘œλΆ€ν„° μžμ›μ„ μš”μ²­ν•˜λŠ” λ™μž‘
  • 데이터 전솑 방식
    • μš”μ²­ 본문을 μ‚¬μš©ν•˜μ§€ μ•Šκ³ , μš”μ²­ URI에 Path Variable μ΄λ‚˜ Query String 을 μ‚¬μš©ν•  것을 ꢌμž₯ν•©λ‹ˆλ‹€.
  • λ³΄μ•ˆ
    • 데이터가 URL에 ν¬ν•¨λ˜λ―€λ‘œ URL이 μ„œλ²„ μΈ‘ 접속 λ‘œκ·Έλ‚˜ λΈŒλΌμš°μ € νžˆμŠ€ν† λ¦¬μ— μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€. 이둜 인해 민감 데이터가 λ…ΈμΆœλ  κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.
    • ν•΄κ²° 방법
      • POST μš”μ²­ 본문에 데이터 λ‹΄κΈ°
      • HTTPS둜 μš”μ²­ν•˜μ—¬ 전솑 ꡬ간 μ•”ν˜Έν™”ν•˜κΈ°(BUT λ‘œκ·Έλ‚˜ λΈŒλΌμš°μ € νžˆμŠ€ν† λ¦¬μ— λ‚¨λŠ” λ¬Έμ œλŠ” ν•΄κ²°λ˜μ§€ μ•ŠμŒ!)
      • μ• μ΄ˆμ— λ―Όκ°ν•œ 정보(μ‚¬μš©μž 인증 토큰, 개인 정보, λΉ„λ°€λ²ˆν˜Έ λ“±)κ°€ URL Query String에 λ“€μ–΄κ°€μ§€ μ•Šλ„λ‘ μ„€κ³„ν•˜κΈ°
      • ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ Query String μ•”ν˜Έν™” ν›„ GET μš”μ²­ -> μ„œλ²„μ—μ„œ λ³΅ν˜Έν™” ν›„ 데이터 처리
  • 데이터 길이 μ œν•œ O
    • μ›Ή λΈŒλΌμš°μ €μ™€ μ„œλ²„λ§ˆλ‹€ λ‹€λ₯΄μ§€λ§Œ URL의 길이 μ œν•œμ΄ μžˆμŠ΅λ‹ˆλ‹€.
  1. 캐싱 O
    1. GET μš”μ²­μ˜ 응닡은 캐싱 κ°€λŠ₯ν•©λ‹ˆλ‹€.
    2. μ›Ή λΈŒλΌμš°μ €κ°€ μ„œλ²„λ‘œλΆ€ν„° 받은 GET μš”μ²­μ˜ 응닡을 둜컬 μΊμ‹œμ— μ €μž₯ν•˜κ³ , 동일 μš”μ²­μ΄ μžˆμ„ λ•Œ μ„œλ²„μ— λ‹€μ‹œ μš”μ²­ν•˜μ§€ μ•Šκ³  μΊμ‹œμ— μ €μž₯된 응닡을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. λ©±λ“±μ„± O
    1. 멱등성이 보μž₯λ©λ‹ˆλ‹€. 즉, 동일 μš”μ²­μ„ ν•œ 번 λ³΄λ‚΄λŠ” 것과 μ—¬λŸ¬ 번 연속 λ³΄λ‚΄λŠ” 것이 같은 효과λ₯Ό μ§€λ‹™λ‹ˆλ‹€.

 

2. POST

  • λͺ©μ 
    • μ„œλ²„λ‘œ 데이터λ₯Ό μ „μ†‘ν•˜μ—¬ μžμ›μ„ μƒμ„±ν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈ ν•˜λŠ” λ™μž‘
  • 데이터 전솑 방식
    • μš”μ²­ λ³Έλ¬Έ(body)에 데이터λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
  • λ³΄μ•ˆ
    • 데이터가 URL에 ν¬ν•¨λ˜μ§€ μ•ŠμœΌλ―€λ‘œ GET μš”μ²­μ— λΉ„ν•΄ μƒλŒ€μ μœΌλ‘œ μ•ˆμ „ν•©λ‹ˆλ‹€.
    • κ·Έλž˜λ„ 데이터 μ•”ν˜Έν™” ν•˜λ €λ©΄ HTTPS λ₯Ό 써야 ν•©λ‹ˆλ‹€. (e.g. Nginx client_max_body_size λ“±)
  • 데이터 길이 μ œν•œ O
    • POST μš”μ²­ 본문의 데이터 길이 μ œν•œμ€ GET λ³΄λ‹€λŠ” μƒλŒ€μ μœΌλ‘œ ν¬μ§€λ§Œ, μ ˆλŒ€μ μœΌλ‘œ 길이 μ œν•œμ΄ μ—†λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.
    • μ›Ή μ„œλ²„λ‚˜ μ„œλ²„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μΈ‘μ—μ„œ μš”μ²­ λ³Έλ¬Έ 크기에 λŒ€ν•œ 섀정을 해쀄 수 μžˆμŠ΅λ‹ˆλ‹€.
    • (μ°Έκ³ ) μ„œλ²„λ₯Ό λ»—κ²Œ ν•˜λŠ” 원인이 될 수 μžˆμœΌλ―€λ‘œ λŒ€μš©λŸ‰ 데이터 μ²˜λ¦¬λŠ” λ³„λ„λ‘œ λΆ„λ¦¬ν•˜λŠ” 게 μ’‹λ‹€κ³  ν•©λ‹ˆλ‹€. [μ°Έκ³ 1] [μ°Έκ³ 2]
  • 캐싱 X
    • POST μš”μ²­μ˜ 응닡은 기본적으둜 μΊμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. [μ°Έκ³  - RFC 7231]
      • 멱등성이 보μž₯λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
      • POST μš”μ²­ λ³Έλ¬Έμ—λŠ” 민감 데이터가 포함될 수 μžˆμœΌλ―€λ‘œ μΊμ‹±ν•˜λ©΄ λ³΄μ•ˆ μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.
      • λŒ€μš©λŸ‰ 데이터가 전솑될 수 있기 λ•Œλ¬Έμ— 캐싱이 λ©”λͺ¨λ¦¬ μ„±λŠ₯에 이점을 μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ©±λ“±μ„± X
    • 멱등성이 보μž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 즉, 동일 μš”μ²­μ„ ν•œ 번 λ³΄λ‚΄λŠ” 것과 μ—¬λŸ¬ 번 연속 λ³΄λ‚΄λŠ” 것이 λ‹€λ₯Έ 효과λ₯Ό 지닐 수 μžˆμŠ΅λ‹ˆλ‹€.

 

3. GET vs POST 차이점 정리

  GET POST
λͺ©μ  μžμ› μš”μ²­ μžμ› 생성 / μ—…λ°μ΄νŠΈ
데이터 전솑 방식 URI Query String / Path Variable μš”μ²­ λ³Έλ¬Έ
λ³΄μ•ˆ URL에 민감 데이터가 λ“œλŸ¬λ‚  수 있음 URL에 민감 데이터가 λ“œλŸ¬λ‚˜μ§€ μ•Šμ•„ GET λ³΄λ‹€λŠ” μƒλŒ€μ μœΌλ‘œ μ•ˆμ „ν•¨
데이터 길이 μ œν•œ βœ… βœ…
캐싱 βœ… ❌
λ©±λ“±μ„± βœ… ❌

 

PUT vs PATCH vs DELETE

1. PUT

  • λͺ©μ 
    • μ„œλ²„μ— μžμ›μ„ μƒμ„±ν•˜κ±°λ‚˜ κΈ°μ‘΄ μžμ›μ„ λŒ€μ²΄ν•˜λŠ” λ™μž‘
  • 데이터 전솑 방식
    • μ§€μ •λœ URI의 μžμ›μ„ μˆ˜μ •ν•©λ‹ˆλ‹€.(Path Variable)
    • μš”μ²­ 본문에 μžμ›μ˜ 전체 데이터λ₯Ό ν¬ν•¨ν•˜μ—¬ μ „μ†‘ν•©λ‹ˆλ‹€.
  • λ³΄μ•ˆ
    • μžμ› 전체에 λŒ€ν•œ κΆŒν•œ 검증이 ν•„μš”ν•©λ‹ˆλ‹€.
  • 캐싱 X
    • PUT μš”μ²­μ˜ 응닡은 기본적으둜 μΊμ‹±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ©±λ“±μ„± O
    • PUT μš”μ²­μ€ 멱등성을 보μž₯ν•©λ‹ˆλ‹€. λ™μΌν•œ μš”μ²­μ„ μ—¬λŸ¬ 번 보내도 κ²°κ³ΌλŠ” λ™μΌν•©λ‹ˆλ‹€.

 

2. PATCH

  • λͺ©μ 
    • μ„œλ²„ μžμ›μ˜ μΌλΆ€λ§Œ μˆ˜μ •ν•˜λŠ” λ™μž‘
  • 데이터 전솑 방식
    • μ§€μ •λœ URI의 μžμ›μ„ μˆ˜μ •ν•©λ‹ˆλ‹€.(Path Variable)
    • μš”μ²­ λ³Έλ¬Έμ—λŠ” μˆ˜μ •ν•  λ°μ΄ν„°μ˜ μΌλΆ€λ§Œ ν¬ν•¨ν•©λ‹ˆλ‹€.
  • λ³΄μ•ˆ
    • μžμ› 전체, μˆ˜μ •ν•  ν•„λ“œμ— λŒ€ν•œ κΆŒν•œ 검증이 ν•„μš”ν•©λ‹ˆλ‹€. 
  • 캐싱 X
    • PATCH μš”μ²­μ˜ 응닡은 기본적으둜 μΊμ‹±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ©±λ“±μ„± X
    • PATCH μš”μ²­μ€ 멱등성을 보μž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 
    • ν•˜μ§€λ§Œ PUTκ³Ό 같은 λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•œλ‹€λ©΄(μžμ› 전체 λŒ€μ²΄) 멱등성을 κ°€μ§€κ²Œ ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

3. DELETE

  • λͺ©μ 
    • μ„œλ²„μ—μ„œ μžμ›μ„ μ‚­μ œν•˜λŠ” λ™μž‘
  • 데이터 전솑 방식
    • μ§€μ •λœ URI의 μžμ›μ„ μˆ˜μ •ν•©λ‹ˆλ‹€.(Path Variable)
    • μš”μ²­ 본문은 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ³΄μ•ˆ
    • μžμ›μ— λŒ€ν•œ κΆŒν•œ 검증이 ν•„μš”ν•©λ‹ˆλ‹€.
  • 캐싱 X
    • DELETE μš”μ²­μ˜ 응닡은 기본적으둜 μΊμ‹±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ©±λ“±μ„± O
    • DELETE μš”μ²­μ€ 멱등성을 보μž₯ν•©λ‹ˆλ‹€. μžμ›μ΄ μ‚­μ œλ˜λ©΄ μ—¬λŸ¬ 번 μš”μ²­μ„ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€.

 

4. PUT vs PATCH vs DELETE 차이점 정리

  PUT PATCH DELETE
λͺ©μ  μžμ› 생성 / 전체 λŒ€μ²΄ μžμ› 일뢀 μˆ˜μ • μžμ› μ‚­μ œ
데이터 전솑 방식 URI Path Variable, μš”μ²­ λ³Έλ¬Έ URI Path Variable, μš”μ²­ λ³Έλ¬Έ URI Path Variable
λ³΄μ•ˆ κΆŒν•œ 검증 ν•„μš” κΆŒν•œ 검증 ν•„μš” κΆŒν•œ 검증 ν•„μš”
캐싱 ❌ ❌ ❌
λ©±λ“±μ„± βœ… ❌ βœ…

 

5. POST vs PUT 차이점 정리

  POST PUT
λͺ©μ  μžμ› 생성 / μ—…λ°μ΄νŠΈ μžμ› 생성 / 전체 λŒ€μ²΄
데이터 전솑 방식 μš”μ²­ λ³Έλ¬Έ URI Path Variable, μš”μ²­ λ³Έλ¬Έ
λ©±λ“±μ„± ❌ βœ…

 

  • POSTκ³Ό PUT μš”μ²­ λ‘˜ λ‹€ μžμ›μ„ 생성할 μˆ˜λ„, μ—…λ°μ΄νŠΈ ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 
  • κ°€μž₯ 큰 차이점은 λ©±λ“±μ„± 보μž₯ 여뢀라고 λ³Ό 수 μžˆλŠ”λ°μš”. 
    • POSTλŠ” 멱등성을 보μž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ„œλ²„κ°€ μžμ›μ˜ URIλ₯Ό κ²°μ •ν•˜κΈ° λ•Œλ¬Έμ— POSTλŠ” μžμ›μ„ 생성할 λ•Œ μ‚¬μš©ν•˜λŠ” 게 μ’‹κ³ , μžμ› 일뢀 μ—…λ°μ΄νŠΈμ—λŠ” μ˜λ―Έμƒ PATCHκ°€ μ’€ 더 적합할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • PUT은 멱등성을 보μž₯ν•©λ‹ˆλ‹€. μžμ›μ˜ URIλ₯Ό ν¬ν•¨ν•΄μ„œ μš”μ²­μ„ 보낼 수 있고, μžμ› 전체 μ—…λ°μ΄νŠΈμ˜ 경우 PUT이 더 μ ν•©ν•˜λ‹€κ³  λ³Ό 수 μžˆκ² μŠ΅λ‹ˆλ‹€.

 

λ‚˜λ¨Έμ§€ λ©”μ„œλ“œ 4κ°€μ§€

  • HEAD
    • GETκ³Ό λ™μΌν•˜μ§€λ§Œ, 응닡 본문을 ν¬ν•¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ„œλ²„λŠ” μš”μ²­λœ μžμ›μ˜ ν—€λ”λ§Œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • μžμ›μ„ λ‹€μš΄λ‘œλ“œν•˜μ§€ μ•Šκ³  μžμ›μ˜ λ©”νƒ€λ°μ΄ν„°λ‚˜ 쑴재 μ—¬λΆ€λ₯Ό μ κ²€ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 
    • λ˜ν•œ ν΄λΌμ΄μ–ΈνŠΈκ°€ 캐싱을 μ‚¬μš©ν•˜λŠ” 경우 HEAD μš”μ²­μ„ 톡해 μ‘λ‹΅μ˜ Last-Modified ν—€λ”λ‚˜ ETag 헀더λ₯Ό 검사해 λ‘œμ»¬μ— μΊμ‹œλœ 버전이 μ΅œμ‹ μΈμ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. [μ°Έκ³ ]
  • CONNECT
    • ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 터널 μ„€μ • λ™μž‘
    • ν΄λΌμ΄μ–ΈνŠΈκ°€ HTTPS μš”μ²­μ„ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό 톡해 λͺ©μ μ§€ μ„œλ²„λ‘œ 보내렀할 λ•Œ CONNECT λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λ‘μ‹œ μ„œλ²„μ™€ 터널을 μ„€μ •ν•©λ‹ˆλ‹€. ν”„λ‘μ‹œ μ„œλ²„λŠ” 이 μš”μ²­μ„ λ°›μ•„μ„œ λͺ©μ μ§€ μ„œλ²„μ™€μ˜ TCP 연결을 μ„€μ •ν•˜κ³ , 이 연결을 ν΄λΌμ΄μ–ΈνŠΈμ™€ ν”„λ‘μ‹œ μ„œλ²„ 사이에 ν„°λ„λ§ν•©λ‹ˆλ‹€.
  • OPTIONS
    • μ„œλ²„μ—μ„œ μ§€μ›ν•˜λŠ” λ©”μ„œλ“œ μ˜΅μ…˜μ„ μš”μ²­ν•˜λŠ” λ™μž‘
    • μ„œλ²„κ°€ νŠΉμ • μžμ›μ— λŒ€ν•΄ μ–΄λ–€ HTTP λ©”μ„œλ“œλ₯Ό μ§€μ›ν•˜λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ˜ν•œ, CORS(Cross-Origin Resource Sharing) 정책을 ν™•μΈν•˜λŠ” 데에도 μ‚¬μš©λ©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈ(= μ›Ή λΈŒλΌμš°μ €)κ°€ λ‹€λ₯Έ λ„λ©”μΈμ˜ μžμ›μ— μ ‘κ·Όν•˜λ €κ³  ν•  λ•Œ, Preflight μš”μ²­μœΌλ‘œ OPTIONS μš”μ²­μ„ 보내 μ„œλ²„κ°€ ν—ˆμš©ν•˜λŠ” λ©”μ„œλ“œμ™€ 헀더λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. [μ°Έκ³ ]
  • TRACE
    • μš”μ²­μ„ 따라 경둜 μΆ”μ ν•˜μ—¬ μ΅œμ’… μ›Ή μ„œλ²„λ‘œ κ°€λŠ” λ„€νŠΈμ›Œν¬ 경둜λ₯Ό μ²΄ν¬ν•˜λŠ” λ™μž‘
    • TRACE λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ XST(Cross-Site Tracing) 곡격을 ν•  수 μžˆμœΌλ―€λ‘œ, μ„œλ²„μ—μ„œλŠ” TRACE λ©”μ„œλ“œλ₯Ό ν—ˆμš©ν•˜μ§€ μ•Šλ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€. [μ°Έκ³ ]
    • λ”°λΌμ„œ 주둜 λ„€νŠΈμ›Œν¬ 문제 진단을 μœ„ν•΄ 디버깅 μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

 

μ°Έκ³