3 λΆ„ μ†Œμš”

HTTP Status Code? πŸ’―

HTTP Status Code : ν΄λΌμ΄μ–ΈνŠΈκ°€ 보낸 HTTP μš”μ²­μ— λŒ€ν•œ μ„œλ²„μ˜ 응닡 μ½”λ“œλ‘œ, μƒνƒœ μ½”λ“œμ— 따라 μš”μ²­μ˜ 성곡/μ‹€νŒ¨ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•¨.

2XX SUCCESS


200λ²ˆλŒ€μ˜ μƒνƒœμ½”λ“œλŠ” μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μš”μ²­μ΄ μ„±κ³΅μ μœΌλ‘œ μ²˜λ¦¬λ˜μ—ˆμ„λ•Œ λ³΄λ‚΄λŠ” μ½”λ“œλ“€μ΄λ‹€.

200번(OK) β–Ά ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ μ„œλ²„κ°€ μ •μƒμ μœΌλ‘œ μ²˜λ¦¬ν–ˆλ‹€.

HTTP/1.1 200 OK
{
"result" : false
"status" : 400
}

μœ„μ™€ 같이 μ„±κ³΅ν–ˆλ‹€λŠ” 200μ½”λ“œλ₯Ό λ³΄λƒˆμ§€λ§Œ μ‹€μ œλ‚΄μš©μ€ μ‹€νŒ¨μΈ 경우둜 μ“°μ΄λŠ” 사둀가 μžˆλ‹€λ©΄ λ‹Ήμž₯ μˆ˜μ •ν•˜μž.



201번(Created) β–Ά ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ μ„œλ²„κ°€ μ •μƒμ μœΌλ‘œ μ²˜λ¦¬ν–ˆκ³  μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€κ°€ 생겼닀.

201 μƒνƒœ μ½”λ“œλŠ” POST, PUT μš”μ²­μ— λŒ€ν•œ 응닡에 주둜 μ‚¬μš©λœλ‹€.



202번(Accepted) β–Ά ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ€ μ •μƒμ μ΄λ‚˜, μ„œλ²„κ°€ 아직 μš”μ²­μ„ μ™„λ£Œν•˜μ§€ λͺ»ν–ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ 정상적이면 μ„œλ²„μ—μ„  μž‘μ—…μ˜ 성곡/μ‹€νŒ¨ μ‘λ‹΅ν•˜λŠ” 게 μΌλ°˜μ μ΄λ‚˜, μž‘μ—… μ™„λ£Œλ₯Ό μœ„ν•œ 일련의 μž‘μ—…λ“€μ΄ 였래 걸리기 λ•Œλ¬Έμ— λ‚˜μ€‘μ— μ•Œλ €μ£Όκ² λ‹€λŠ” μ˜λ―Έλ‹€.



204번(No Content) β–Ά ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ€ 정상적이닀. ν•˜μ§€λ§Œ 컨텐츠λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.

μžμ› μ‚­μ œ μš”μ²­μ„ ν–ˆκ³  이 μš”μ²­μ΄ μœ νš¨ν•˜λ‹ˆ μ„œλ²„λŠ” ν•΄λ‹Ή μžμ›μ„ μ‚­μ œν–ˆλ‹€. 더 이상 응닡할 컨텐츠가 μ—†κΈ° λ•Œλ¬Έμ— 컨텐츠가 μ—†λŠ” 204둜 μ‘λ‹΅ν•œλ‹€.

(μ—¬κΈ°μ„œ μ£Όμ˜ν•  점은 200으둜 μ‘λ‹΅ν•˜κ³  응닡 body에 null, {}, [], false λ“±μœΌλ‘œ μ‘λ‹΅ν•˜λŠ” 것과 λ‹€λ₯΄λ‹€λŠ” 것이닀. 204의 경우 HTTP Response bodyκ°€ μ•„μ˜ˆ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²½μš°λ‹€.)

Example

PUT

  • μžμ› μˆ˜μ • μš”μ²­μ˜ κ²°κ³Όκ°€ 기쑴의 μžμ› λ‚΄μš©κ³Ό λ™μΌν•˜μ—¬ λ³€κ²½λœ λ‚΄μš©μ΄ 없을 λ•Œ 204둜 응닡할 수 μžˆλ‹€.

  • λ§Œμ•½ μˆ˜μ • μš”μ²­μœΌλ‘œ μžμ›μ˜ λ‚΄μš©μ΄ λ³€κ²½λœλ‹€λ©΄ 201둜 응닡할 것이닀.

DELETE

  • μ‚­μ œ μš”μ²­μœΌλ‘œ μžμ›μ„ μ‚­μ œν•˜μ—¬ 더 이상 μ‘΄μž¬ν•˜μ§€ μ•Šκ³  κ·Έ μžμ›μ„ μ°Έμ‘°ν•˜λŠ” λͺ¨λ“  μžμ›λ„ μ‚­μ œλ˜μ–΄ 더 이상 HTTP bodyλ₯Ό μ‘λ‹΅ν•˜λŠ” 것이 λ¬΄μ˜λ―Έν•΄μ‘Œμ„ λ•Œ μ‚¬μš©ν•œλ‹€.


4XX Client errors


4XX의 μƒνƒœ μ½”λ“œλ“€μ€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ μœ νš¨ν•˜μ§€ μ•Šμ•„ μ„œλ²„κ°€ ν•΄λ‹Ή μš”μ²­μ„ μˆ˜ν–‰ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” μ˜λ―Έλ‹€.

400번(Bad Request) β–Ά ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ μœ νš¨ν•˜μ§€ μ•Šμ•„ 더 이상 μž‘μ—…μ„ μ§„ν–‰ν•˜μ§€ μ•ŠλŠ” 경우

ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ μž‘μ—…μ„ λ°”λ‘œ μ§„ν–‰ν•˜μ§€μ•Šκ³  μœ νš¨μ„±κ²€μ‚¬λΆ€ν„° ν•˜λŠ”κ²ƒμ΄ μ˜³λ‹€.

λŒ€λΆ€λΆ„μ˜ APIλŠ” 사전에 μœ νš¨μ„± 검증을 톡해 400 μƒνƒœ μ½”λ“œλ‘œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μœ νš¨ν•˜μ§€ μ•Šμ€ μš”μ²­μž„μ„ μ‘λ‹΅ν•œλ‹€.

κ·ΈλŸ¬λ‚˜, 400 μƒνƒœ μ½”λ“œλ‘œ μ‘λ‹΅ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλŠ” λΆ€μ‘±ν•˜λ‹€.

였λ₯˜ λ°œμƒ μ‹œ νŒŒλΌλ―Έν„°μ˜ μœ„μΉ˜(path, query, body), μ‚¬μš©μž μž…λ ₯ κ°’, μ—λŸ¬ 이유λ₯Ό κΌ­ λͺ…μ‹œν•˜λŠ” 것이 μ’‹λ‹€.

Example

class RequiredKeys {
  constructor(REQUIRED_KEYS) {
    this.REQUIRED_KEYS = REQUIRED_KEYS;
  }
  verify() {
    for (let key in this.REQUIRED_KEYS) {
      if (!this.REQUIRED_KEYS[key] && this.REQUIRED_KEYS[key] !== 0) {
        const err = new Error(`${key} 정보가 μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.`);
        err.status = 400;
        throw err;
      }
    }
  }
}


401번(Unauthorized) β–Ά ν΄λΌμ΄μ–ΈνŠΈκ°€ κΆŒν•œμ΄ μ—†κΈ° λ•Œλ¬Έμ— μž‘μ—…μ„ 진행할 수 μ—†λŠ” 경우

μƒνƒœ μ½”λ“œ μ΄λ¦„λ§Œ 보면 κΆŒν•œ(authorized)에 λŒ€ν•œ λ‚΄μš©μ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, 사싀 인증(authenticated)에 λŒ€ν•œ 이야기닀.

401은 비인증이닀.



403번(Forbidden) β–Ά ν΄λΌμ΄μ–ΈνŠΈκ°€ κΆŒν•œμ΄ μ—†κΈ° λ•Œλ¬Έμ— μž‘μ—…μ„ 진행할 수 μ—†λŠ” 경우

403은 κΆŒν•œ(authorized)에 λŒ€ν•œ λ‚΄μš©μ΄λ‹€.



404번(Not Found) β–Ά ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ μžμ›μ΄ μ‘΄μž¬ν•˜μ§€ μ•Šλ‹€.

404λ²ˆμ—λŸ¬λŠ” 크게 2κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€.

  • κ²½λ‘œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ

μ‘΄μž¬ν•˜μ§€ μ•Šμ€ κ²½λ‘œλŠ” μ‰½κ²Œ 404둜 응닡.(λΌμš°ν„°μ—μ„œ 처리)

  • μžμ›μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ

/users/:id μ—μ„œ id값이 λ§Œμ•½ DB에 μ—†λŠ” 값이라면 μžμ›μ΄ μ‘΄μž¬ν•˜μ§€ μ•Šλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

λ”°λΌμ„œ μ‘΄μž¬ν•˜λŠ” κ²½λ‘œμ— λŒ€ν•œ μš”μ²­μ΄λΌλ„ μžμ›μ΄ μ‘΄μž¬ν•˜λŠ”μ§€ νŒŒμ•… ν›„, μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 404 μƒνƒœ μ½”λ“œλ‘œ 응닡해야 ν•œλ‹€



405번(Method Not Allowed) β–Ά ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ ν—ˆμš©λ˜μ§€ μ•ŠλŠ” λ©”μ†Œλ“œμΈ 경우

μžμ›(URI)은 μ‘΄μž¬ν•˜μ§€λ§Œ ν•΄λ‹Ή μžμ›μ΄ μ§€μ›ν•˜μ§€ μ•ŠλŠ” λ©”μ†Œλ“œμΌ λ•Œ μ‘λ‹΅ν•˜λŠ” μƒνƒœ μ½”λ“œλ‹€.

완성도 높은 APIλ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ‚¬μš©ν•˜λŠ”κ²ƒμ„ μΆ”μ²œν•œλ‹€.



409번(Conflict) β–Ά ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ μ„œλ²„μ˜ μƒνƒœμ™€ 좩돌이 λ°œμƒν•œ 경우

400, 401, 403, 404, 405 μƒνƒœ μ½”λ“œμ— μ†ν•˜κΈ° μ• λ§€ν•œ 였λ₯˜μ˜ 상황듀을 409둜 μ‘λ‹΅ν•œλ‹€.

Example

  • μžμ›(URI) /users/1에 μ‘΄μž¬ν•˜λŠ” λ©”μ†Œλ“œκ³  Not 405

  • /users/:idμ—μ„œ :idκ°€ μœ νš¨ν•œ ν˜•μ‹μ΄κ³  Not 400

  • 1 μ‚¬μš©μžλ„ μ‘΄μž¬ν•˜κ³  Not 404

  • ν—€λ”μ˜ 인증(X-TOKEN)도 μ •ν™•ν•˜κ³  Not 401

  • μ‚­μ œ κΆŒν•œλ„ μžˆλŠ” 경우 Not 403

λŒ€λΆ€λΆ„μ˜ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ£Όμ—ˆμ§€λ§Œ λ‘œμ§μžμ²΄κ°€ λ¬Έμ œμžˆμ„ 수 μžˆλ‹€. 예λ₯Όλ“€λ©΄

μ‚¬μš©μžμ˜ κ²Œμ‹œλ¬Όμ΄ μ‘΄μž¬ν•˜λŠ” 경우 μ‚¬μš©μžλ₯Ό μ‚­μ œν•  수 μ—†λ‹€λŠ” λΉ„μ§€λ‹ˆμŠ€ 둜직이 μžˆμ„ 수 μžˆλ‹€.

μ΄λ ‡κ²Œ API μ‚¬μš©μ— μžˆμ–΄ λΉ„μ§€λ‹ˆμŠ€ λ‘œμ§μƒ λͺ¨μˆœμ΄ λ°œμƒν•˜μ—¬ μ²˜λ¦¬κ°€ λΆˆκ°€λŠ₯ν•œ 경우 μ‘λ‹΅ν•˜λŠ” μƒνƒœ μ½”λ“œλ‹€.

  const isExistItem = new IsExistItem(check, resultType, 409);
  isExistItem.existErr('이미 ν’ˆλͺ©μ— μžˆμŠ΅λ‹ˆλ‹€.');

였λ₯˜ 상황과 λ§ˆμ°¬κ°€μ§€λ‘œ 응닡 μ‹œ 였λ₯˜μ˜ 원인을 μ•Œλ €μ•Ό ν•œλ‹€.



429번(Too Many Requests) β–Ά ν΄λΌμ΄μ–ΈνŠΈκ°€ 일정 μ‹œκ°„ λ™μ•ˆ λ„ˆλ¬΄ λ§Žμ€ μš”μ²­μ„ 보낸 경우

ν•΄μ»€λŠ” μ‚¬μš©μžμ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό μ•Œμ•„λ‚΄κΈ° μœ„ν•΄ POST /login API에 passwordλ₯Ό λ¬΄μ°¨λ³„λ‘œ λŒ€μž…ν•˜λ©΄μ„œ μš”μ²­ν•  수 μžˆλ‹€.

μ„œλ²„ μž…μž₯에선 μžμ›μ˜ κΈ°λ°€μ„±(Confidentiality)에 ν”Όν•΄λ₯Ό μž…μ„ 수 μžˆλŠ” κ³΅κ²©μ΄λ©΄μ„œ, μ΄λŸ¬ν•œ 무차별 μš”μ²­μœΌλ‘œ λ‹€λ₯Έ μš”μ²­μ„ μ²˜λ¦¬ν•  수 μ—†κ±°λ‚˜ μ²˜λ¦¬κ°€ λŠ¦μ„ 수 μžˆλŠ” κ°€μš©μ„±(Availability)에 ν”Όν•΄λ₯Ό μž…μ„ 수 μžˆλ‹€.

μ„œλ²„λŠ” μ΄λŸ¬ν•œ 곡격에 λŒ€λΉ„ν•΄ 인증 API의 경우 각 ν΄λΌμ΄μ–ΈνŠΈλŠ” n μ‹œκ°„ λ™μ•ˆ n 회만 μš”μ²­ κ°€λŠ₯ν•˜λ‹€λŠ” 룰을 μ •ν•˜κ³  이것을 μ΄ˆκ³Όν•˜λ©΄ 429 μƒνƒœ μ½”λ“œλ₯Ό 응닡해야 ν•œλ‹€.


5XX SERVER ERRORS


5XX μƒνƒœ μ½”λ“œλ“€μ€ μ„œλ²„ 였λ₯˜λ‘œ 인해 μš”μ²­μ„ μˆ˜ν–‰ν•  수 μ—†λ‹€λŠ” μ˜λ―Έλ‹€.

  • APIλ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 5XX μƒνƒœ μ½”λ“œλŠ” λ‚˜νƒ€λ‚΄μ§€ 말아야 ν•œλ‹€.

  • μ΅œμ‹ μ˜ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬λŠ” 자체 μ›Ήμ„œλ²„λ₯Ό λ‚΄μž₯ν•˜κ³  μžˆμ–΄μ„œ μ›Ήμ„œλ²„(Apache, Nginx) 없이 μš΄μ˜ν•  수 μžˆλ‹€.

  • κ·ΈλŸ¬λ‚˜, 보톡 운영 λ ˆλ²¨μ—μ„œ μ΄λ ‡κ²Œ ν•˜λŠ” κ²½μš°λŠ” λ“œλ¬Όκ³  μ•žμ— μ›Ήμ„œλ²„λ₯Ό 두고 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ—°κ²°ν•΄μ„œ μš΄μ˜ν•œλ‹€.

  • λ”°λΌμ„œ, μƒλ‹¨μ˜ μ›Ήμ„œλ²„(Apache, Nginx)μ—μ„œ λ°œμƒν•˜λŠ” μ–΄μ©” 수 μ—†λŠ” 였λ₯˜λ₯Ό μ œμ™Έν•˜κ³  API에선 5XX μƒνƒœ μ½”λ“œκ°€ μ‘λ‹΅λ˜μ„  μ•ˆλœλ‹€.

  • API λ ˆλ²¨μ—μ„  μ™„λ²½ν•œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό 톡해 5XX μ„œλ²„ 였λ₯˜ μƒνƒœ μ½”λ“œλ₯Ό 방지해야 ν•œλ‹€.

μ—…λ°μ΄νŠΈ: