HTTP μνμ½λ
κΉμνλμ λͺ¨λ κ°λ°μλ₯Ό μν HTTP μΉ κΈ°λ³Έ μ§μ κ°μλ₯Ό μκ°νλ©° μ 리ν κΈμ λλ€.
μν μ½λ
: ν΄λΌμ΄μΈνΈκ° λ³΄λΈ μμ²
μ μ²λ¦¬ μν
λ₯Ό μλ΅
μμ μλ €μ£Όλ κΈ°λ₯
μνμ½λλ₯Ό λ§μ΄ μ¬μ©νλ κ²μ μν©μ λ°λΌ μ ν©νμ§ μμ μ μλ€.
μνμ½λλ ν΄λΌμ΄μΈνΈμ μλ²μμ μ½μμ΄κ³ , λ³΄ν΅ λ§μ΄ μ¬μ©νλ μνμ½λλ₯Ό μ¬μ©νλ©°,
κ°λ°νλ νμ λ°λΌμ μν μ½λλ₯Ό μ ννλ λ± μ΄ μ½μμ μ ν©νκ² μ¬μ©νλ κ²λ μ€μνλ€.
μ’ λ₯
1xx
(Informational): μμ²μ΄ μμ λμ΄ μ²λ¦¬μ€*κ±°μ μ¬μ©λμ§ μμ
2xx
(Successful) : μμ²μ μ μ²λ¦¬
3xx
(Redirection) : μμ²μ μλ£νλ €λ©΄μΆκ° νλμ΄ νμ
4xx
(Client Error) :ν΄λΌμ΄μΈνΈ μ€λ₯
, μλͺ»λ λ¬Έλ² λ±μΌλ‘μλ²κ° μμ²μ μνν μ μμ
5xx
(Server Error) :μλ² μ€λ₯
, μλ²κ° μ μ μμ²μ μ²λ¦¬νμ§ λͺ»ν¨
λ§μ½ λͺ¨λ₯΄λ μν μ½λκ° λ°νλλ€λ©΄?
μ ν΄μ§μ§ μμ μνμ½λ
λ₯Ό μλ²κ° λ°ννλ€λ©΄?- ν΄λΌμ΄μΈνΈλ
μμ μνμ½λλ‘ ν΄μν΄μ μ²λ¦¬
νλ€. - μ νΉμ§μΌλ‘ μλ‘μ΄ μν μ½λκ° μΆκ°λκ±°λ νλ κ²½μ°μ ν΄λΌμ΄μΈνΈλ₯Ό μμ νμ§ μμλ λλ€.
μμ)
279
??? →2xx
(Successful)471
??? →4xx
(Client Error)598
??? →5xx
(Server Error)
μ£Όμ μνμ½λλ€
2xx (Successful)
ν΄λΌμ΄μΈνΈ μμ²μ μ±κ³΅μ μΌλ‘ μ²λ¦¬ν¨.
200
OK : μμ² μ±κ³΅201
Created : μμ²μ μ±κ³΅ν΄μμλ‘μ΄ λ¦¬μμ€κ° μμ±λ¨
202
Accepted : μμ²μ΄ μ μλμμΌλ μ²λ¦¬κ° μλ£λμ§ μμ.204
No Content
200 OK
Request
GET /members HTTP/1.1
Content-Type: application/json
Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: ~
[
{
"username": "user1",
"age": 30
},
{
"username": "user2",
"age": 20
}
]
201 Created
μμ μμ±μ©λ, μμ±λ 리μμ€λ μλ΅μ Location
ν€λ νλλ‘ μλ³
Request
POST /members HTTP/1.1
Content-Type: application/json
{
"username": "user3",
"age": 40
}
Response
HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: ~
Location: /members/2
{
"username": "user3",
"age": 40
}
202 Accepted
μμ²μ΄ μ μλμμΌλ μ²λ¦¬κ° μλ£λμ§ μμ
μμ²μ μ§κΈ
νκ³ 1μκ° λ€ μ€ννλλ‘μμ μ μμ½
ν λ- ex)
λ°°μΉ
204 No Content
μλ²κ° μμ²μ μ±κ³΅μ μΌλ‘ μν
νμ§λ§, μλ΅ νμ΄λ‘λ λ³Έλ¬Έμ λ³΄λΌ λ°μ΄ν°κ° μμ
- ex) μΉ λ¬Έμ νΈμ§κΈ°μ save λ²νΌ
- save λ²νΌμ κ²°κ³Όλ‘λ μ무 λ΄μ©μ΄ μμ΄λ λ¨.
- save λ²νΌμ λλ¬λ κ°μ νλ©΄μ μ μ§ν΄μΌ ν¨.
- κ²°κ³Ό λ΄μ©μ΄ μμ΄λ 204 (2xx)λ©μμ§λ§μΌλ‘ μ±κ³΅μ μΈμν μ μμ.
3xx (Redirection)
μμ²μ μλ£νκΈ° μν΄ μ μ μμ΄μ νΈ(ν΄λΌμ΄μΈνΈ νλ‘κ·Έλ¨ = μΉ λΈλΌμ°μ )
μ μΆκ° μ‘°μΉ νμ
300
Mulitiple Choices : μ μ μ301
Moved Permanently302
Found303
See Other304
Not Modified307
Temporary Redirect308
Permanent Redirect
리λ€μ΄λ μ μ΄ν΄
3xx
μλ΅ κ²°κ³ΌμLocaiton ν€λ
κ° μ‘΄μ¬νλ€λ©΄,Location μμΉ
λ‘ μλ μ΄λ(리λ€μ΄λ νΈ
)- Bλ‘ μ μνμ§ μκ³ AλΌλ URLλ‘ μμ²νλλ° BλΌλ URLλ‘ λ³κ²½λμ΄ μμ²νκ² λ¨
- ex)
/members
→/users
μ’ λ₯
μꡬ
리λ€μ΄λ μ - νΉμ 리μμ€μ
URIκ° μꡬμ μΌλ‘ μ΄λ
- ex) /members → /users
- ex) /event → /new-event
- νΉμ 리μμ€μ
μμ
리λ€μ΄λ μ - μΌμμ μΈ λ³κ²½- μ£Όλ¬Έ μλ£ ν μ£Όλ¬Έ λ΄μ νλ©΄μΌλ‘ μ΄λ
PRG
(Post → Redirect → Get)ν¨ν΄μ μ΄μ©ν¨
- νΉμ 리λ€μ΄λ μ
- κ²°κ³Ό λμ
μΊμ
λ₯Ό μ¬μ©
- κ²°κ³Ό λμ
μꡬ 리λ€μ΄λ μ
301, 308
- 리μμ€μ URIκ° μꡬμ μΌλ‘ μ΄λλ κ²½μ°μ μ¬μ© ex) /members → /users
- νμ¬ μ¬μ©νλ
κ²½λ‘
κ° μμ νλ³κ²½λ¨
μ μλ €μ£ΌκΈ° μν¨. - μλμ URL μ¬μ© X κ²μ μμ§ λ±μμλ λ³κ²½ μΈμ§
301
Moved Permanently : μꡬμ μΌλ‘ μ΄λ λ¨- 리λ€μ΄λ νΈ μ
μμ² λ©μλ
κ°GET
μΌλ‘ λ³ν¨, λ³Έλ¬Έμ΄ μ κ±°λ μ μμ
- 리λ€μ΄λ νΈ μ
308
Permanent Redirect : μꡬ 리λ€μ΄λ μ - 리λ€μ΄λ νΈ μ
μμ² λ©μλ, λ³Έλ¬Έ μ μ§
(μ²μ μμ²μ΄ POSTλ©΄ 리λ€μ΄λ νΈλ POST μ μ§)
- 리λ€μ΄λ νΈ μ
301 308 리λ€μ΄λ νΈ κΈ°λ₯μ κ°μΌλ μμ² λ©μλμ λ³Έλ¬Έμ΄ μ μ§λ¨μ μμ΄μ μ°¨μ΄κ° μμ.
URLμ΄ λ°λλ©΄ ν΄λΌμ΄μΈνΈμμ μλ²λ‘ λ³΄λΌ λ°μ΄ν° μ€νμ΄ λ³κ²½λ μ μμ
μ λ§νλ©΄ 301 GETμΌλ‘ λ³ννλ κ² μ’μ
μΌμμ μΈ λ¦¬λ€μ΄λ μ
302, 307, 303
- 리μμ€μ URIκ° μΌμμ μΌλ‘ λ³κ²½
- μΌμμ λ³κ²½μ΄κΈ° λλ¬Έμ κ²μ μμ§ λ±μμ URLμ λ³κ²½νλ©΄ μλ¨.
302
Found- 리λ€μ΄λ νΈμ μμ² λ©μλκ° GETμΌλ‘ λ³νκ³ λ³Έλ¬Έμ΄ μ κ±°λ μ μμ
307
Temporary Redirect302
μ κΈ°λ₯ λμΌ- μμ² λ©μλ, λ³Έλ¬Έ μ μ§
303
See Other302
μ κΈ°λ₯ λμΌ- 리λ€μ΄λ νΈμ μμ² λ©μλκ° GETμΌλ‘ λ³κ²½λ¨
μ€λ¬΄μμ λ§μ΄ μ
κ°κ°
리λ€μ΄λ μ
νλ κΈ°λ₯μ΄ κ°μΌλ μ‘°κΈμ© μ°¨μ΄κ° μμ302
λ λ©μλλ₯Ό GETμΌλ‘ λ³ν, λ³Έλ¬Έμ΄ μ κ±°λ μλ μκ³ μλ μλ(MAY) λλΆλΆ λ³κ²½λκΈ΄ ν¨.303
μ μμ² λ©μλκ° GETμΌλ‘ λ³κ²½λ¨ (ex POST μμ² → 리λ€μ΄λ νΈ GET μμ²)307
μ μμ² λ©μλ, λ³Έλ¬Έ μ μ§303
μ λͺ ννκ² GETμΌλ‘ λ³κ²½λλ κ²μ΄μ§λ§,302
λ₯Ό μ¬μ©ν΄λ ν¬κ² λ¬Έμ κ° μλ€κ³ ν¨
PRG( Post, Redirect, Get ) ν¨ν΄
μλ μν©μ΄ μκΈΈ μ μλ€.
- POSTλ‘ μ£Όλ¬Έ νμ μΉ λΈλΌμ°μ λ₯Ό μλ‘κ³ μΉ¨νλ©΄?
- μλ‘κ³ μΉ¨μΌλ‘ λ€μ μμ² →
μ€λ³΅
μ£Όλ¬Έμμ²μ΄ λ°μ
νλ€ - λ¬Όλ‘ μλ²μμ μ΄λ₯Ό λ§μμΌνκΈ΄ νμ§λ§, ν΄λΌμ΄μΈνΈ μΈ‘μμλ λ°©μ§ν΄μ£ΌκΈ° μν΄μ
- μμ² λ©μλλ₯Ό GETμΌλ‘ λ³κ²½ν΄μ μ΄λ₯Ό λ°©μ§ν΄μ£Όλ κ²μ΄
PRG ν¨ν΄
μ΄λ€. - μ΄λ κ² νλ©΄
μμ² λ©μλκ° GETμΌλ‘ λ³κ²½
λμκΈ° λλ¬Έμμλ‘κ³ μΉ¨
μ ν΄λGETμΌλ‘ κ²°κ³Ό νλ©΄λ§ μ‘°ννκ² λλ€.
λ°λΌμ μ€λ³΅ μμ²μ λ§κΈ° μν΄ POST → Redirect → μμ² λ©μλλ₯Ό GETμΌλ‘ λ³κ²½νλ PRG ν¨ν΄μ κ°μ§λ κ²μ΄ μμ μ μ΄λ€.
λν PRG ν¨ν΄μ μ¬μ©νλ©΄ μλ² μΈ‘μμ μ€λ³΅ μ£Όλ¬Έ μλ¬μ λν λ‘κ·Έλ μ€μ΄λ€κ² λλ€.
κ·Έλμ 302, 307, 303 μ€ λ μ¬μ©ν΄μΌ νλ?
- μ 리
302
Found → GETμΌλ‘ λ³ν μ μμ307
Temporary Redirect → λ©μλκ° λ³κ²½λμ§ μμ303
See Other → GETμΌλ‘ λ³ν¨
- μμ¬
- μ²μ 302 μ€νμ μλλ HTTP λ©μλ μ μ§λ₯Ό μν κ²μ΄μλ€κ³ ν¨.
- κ·Έλ°λ° μΉ λΈλΌμ°μ λ€ λλΆλΆμ΄ GETμΌλ‘ λ°κΏλ²λ Έκ³ (μΌλΆλ λ€λ₯΄κ² λμ)
- μ€νμ λν
λͺ¨νΈν¨
μ΄ μκΉ - κ·Έλμ λͺ¨νΈν 302λ₯Ό λμ νλ
λͺ νν
307, 303μ΄ λ±μ₯νκ² λ¨ (+ 301 λμμΌλ‘ 308 λ±μ₯)
- νμ€
- 307, 303μ κΆμ₯νμ§λ§ νμ€μ μΌλ‘ μ΄λ―Έ λ§μ μ ν리μΌμ΄μ λΌμ΄λΈλ¬λ¦¬λ€μ΄ 302λ₯Ό κΈ°λ³Έκ°μΌλ‘ μ¬μ©
- μλ 리λ€μ΄λ μ μμ GETμΌλ‘ λ³ν΄λ λλ©΄ 302λ₯Ό μ¬μ©ν΄λ ν° λ¬Έμ κ° μμ
κΈ°ν 리λ€μ΄λ μ
300, 304
300
Multiple Choices : μ μ304
NOT MODIFIED : μ§μ§ λ§μ΄ μ΄λ€κ³ ν¨μΊμ
λ₯Ό λͺ©μ μΌλ‘ μ¬μ©- μλ²κ° ν΄λΌμ΄μΈνΈμκ² λ¦¬μμ€κ° μμ λμ§ μμμμ μλ €μ£ΌκΈ° μν¨ (μΊμλ‘ λ¦¬λ€μ΄λ νΈ ν¨)
- ν΄λΌμ΄μΈνΈκ° μλ²μκ² "λ΄κ° μ΄ μ΄λ―Έμ§λ₯Ό κ°μ§κ³ μλλ° μ΄κ±Έ μ¨λ λΌ?" λΌκ³ λ¬Όμ΄λ³΄κ³
- μλ²μμλ "리μμ€κ° μμ λμ§ μμμΌλ μ¬μ©ν΄λ λΌ" λΌλ μλ΅μ νλ κ²
- λ‘컬 μΊμλ₯Ό μ¬μ©ν΄μΌ νλ―λ‘ responseμ bodyλ₯Ό ν¬ν¨νλ©΄ μλ¨.
- μ‘°κ±΄λΆ GET, HEAD μμ² μ μ¬μ©
4xx (Client Error)
μ€λ₯μ μμΈ
μ΄ν΄λΌμ΄μΈνΈ
μ μμμμ²μ μλͺ»λ λ¬Έλ²
λ±μΌλ‘ μλ²κ° μμ²μ μνν μ μμ4xx
μ€λ₯λ ν΄λΌμ΄μΈνΈ μμ²μ λν΄μ μ€λ₯κ° μκΈ°λλ¬Έμ κ°μ λ°μ΄ν°λ₯Ό 보λ΄λ μ€λ₯κ° λ°μν΄μΌν¨.μ€μ
: 5xx μ€λ₯κ° ν°μ§λ€κ° μλ²κ° 볡ꡬλλ©΄ κ°μ μμ²μ 보λμ λ μ€λ₯κ° λ°μνμ§ μκ²λλλ°, μ΄λ° κ²½μ°μλ 4xxλ₯Ό μ°μ§ μλ κ²μ΄ μ ν©ν¨- μ¦, μ΄λ―Έ μλͺ»λ μμ²μ κ°μ μ¬μλλ μ€ν¨ν΄μΌ ν¨.
4xx error μμλ μ€ν¨ν μμ²μ λκ°μ΄ μ¬μμ² νμ λ κ°μ μλ΅(μ€ν¨)μ΄μ΄μΌ ν¨μ μ£Όμ
400
Bad Request- ν΄λΌμ΄μΈνΈκ° μλͺ»λ μμ²μ ν΄μ μλ²κ° μμ²μ μ²λ¦¬ν μ μμ.
- μμ² κ΅¬λ¬Έ, λ©μμ§ λ±μ μ€λ₯(
μμ² νλΌλ―Έν°
,API μ€ν
λ±) - ν΄λΌμ΄μΈνΈλ μμ² λ΄μ©μ λ€μ κ²ν νκ³ λ³΄λ΄μΌν¨.
401
UnauthorizedμΈμ¦
(Authentication) λμ§ μμ401
μ€λ₯ λ°μ μ μλ΅μWWW-Authenticate
ν€λμ ν¨κ» μΈμ¦ λ°©λ²μ μ€λͺμΈμ¦
: λ³ΈμΈμ΄ λꡬμΈμ§ νμΈ (λ‘κ·ΈμΈ)μΈκ°
: κΆν λΆμ¬ (ADMIN κΆνμ²λΌ νΉμ 리μμ€μ μ κ·Όν μ μλ κΆν, μΈμ¦μ΄ μμ΄μΌ μΈκ°κ° μμ)- μ€λ₯ λ©μμ§κ° Unauthorized(μΈκ° μλ¨)μ΄μ§λ§ μΈμ¦λμ§ μμμ μλ―Έ (μ΄λ¦μ΄ μμ¬μ΄ νΈ)
403
Forbidden- μλ²κ° μμ²μ μ΄ν΄νμ§λ§,
κΆν
μ΄ μμ΄μΉμΈμ κ±°λΆ
- μ£Όλ‘ μΈμ¦ μ격 μ¦λͺ μ μμ§λ§, μ κ·Ό κΆνμ΄ λΆμΆ©λΆν κ²½μ°
- ex) adminμ΄ μλ μΌλ° userκ° admin λ±κΈμ 리μμ€μ μ κ·Όνλ κ²½μ°
- μλ²κ° μμ²μ μ΄ν΄νμ§λ§,
404
Not Found- μλ²κ° 리μμ€λ₯Ό μ°Ύμ μ μμ
- μλ² μ μ₯μμλ ν΄λΉ 리μμ€κ° μλλ° ν΄λΌμ΄μΈνΈκ° μμ²ν μν©
- λ°λΌμ ν΄λΌμ΄μΈνΈκ° μλͺ»λ μμ²μ ν¨μ μλ―Έ
- λλ ν΄λΌμ΄μΈνΈκ° κΆνμ΄ λΆμ‘±ν 리μμ€μ μ κ·Όν λ
ν΄λΉ 리μμ€λ₯Ό μ¨κΈ°κ³ μΆμ λ μ¬μ©
5xx (Server Error)
μλ² λ¬Έμ
λ‘ μ€λ₯ λ°μ- NullPointExecption, DB κ΄λ ¨ λ±λ±..
- μλ² λ¬Έμ μ΄κΈ° λλ¬Έμ μλ²κ° 볡κ·λλ©΄ μ¬ μμ² μ μ±κ³΅
500
Internal Server Error- μλ² λ΄λΆ λ¬Έμ λ‘ μ€λ₯ λ°μ, μ 맀νλ©΄ 500 μ€λ₯ λ°μ μν΄
503
Service Unavailable- μλΉμ€ μ΄μ© λΆκ°
- μλ²κ°
μΌμμ μΈ κ³ΌλΆν
λλμμ λ μμ
μΌλ‘ μ μ μμ²μ μ²λ¦¬ν μ μμμ μλ―Έ Retry-After
ν€λ νλλ‘ μΌλ§λ€μ 볡ꡬλλ μ§ λ³΄λΌ μ μμ- κ·Έλ¬λ λλΆλΆ μμΈ‘ λΆκ°λ₯νκΈ°μ λ°λ‘ 500 errorκ° λμ€λ κ²½μ°κ° λ§μ.
5xx errorλ μ§μ§ μλ²μ λ¬Έμ κ° μμ λλ§ λ°μμν€μ
ex ) 20μΈ μ΄μμκ² μ μ©νλ μλΉμ€μΈλ° 15μΈκ° μ μνλ€? μ΄ κ²½μ°μλ 400μΌλ‘ ν΄κ²°νλ λ°©ν₯μΌλ‘ κ³ λ―Ό
λ§λ¬΄λ¦¬
1xx
Informational- μμ²μ΄ μμ λμ΄ μ²λ¦¬ μ€
- κ±°μ μ μ
2xx
Success- μμ² μ±κ³΅
3xx
Redirection- μμ²μ μλ£νκΈ° μν΄ μΆκ° μ‘°μΉ(리λ€μ΄λ μ ) κ° νμν¨
4xx
Client Error- ν΄λΌμ΄μΈνΈμ μμ² μ€λ₯(μμ² νλΌλ―Έν°, API μ€ν λ±)
- μ€ν¨νλ μμ²μ κ°μ μμ²μ μ¬μλ ν΄λ μ€ν¨ν΄μΌν¨
5xx
Server Error- μλ² λ΄λΆ μ€λ₯
- μλ² λ΄λΆ μ€λ₯κ° κ³ μ³μ§λ€λ©΄ μ¬ μμ² μ μ±κ³΅