🧷 CS-Network μŠ€ν„°λ””

μ½”λ“œμŠ€μΏΌλ“œ 과정을 마치고 ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμžλ‘œμ„œ μ•Œμ•„μ•Όλ  λ„€νŠΈμ›Œν¬ 지식을 μ±„μš°κΈ° μœ„ν•΄ μ‹œμž‘ν•œ CS μŠ€ν„°λ””!
Tech-Interview-Networkλ₯Ό μ°Έκ³ ν•˜μ—¬ μŠ€ν„°λ””λ₯Ό μ§„ν–‰ν•˜κΈ°λ‘œ ν–ˆλ‹€.

2. HTTP μ‘λ‹΅μ½”λ“œμ— λŒ€ν•΄ μ„€λͺ…ν•΄ μ£Όμ„Έμš”.

HTTP μ‘λ‹΅μ½”λ“œλŠ” HTTP μš”μ²­μ— λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ μš”μ²­μ˜ 처리 μƒνƒœλ₯Ό μ•Œλ €μ£ΌλŠ” μ½”λ“œλ‘œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ HTTP 톡신이 λ³΅μž‘ν•΄μ§μ— 따라 이λ₯Ό κ°„λ‹€λ‚˜κ²Œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€. 100λ²ˆλΆ€ν„° 500λ²ˆλŒ€λ‘œ 크게 5κ°€μ§€μ˜ 응닡을 μ½”λ“œλ‘œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 100λ²ˆλŒ€λŠ” μš”μ²­μ„ λ°›μ•„ μž‘μ—…μ„ 진행 μ€‘μ΄λΌλŠ” 의미, 200λ²ˆλŒ€λŠ” μš”μ²­μ„ μ„±κ³΅μ μœΌλ‘œ λ°›μ•˜κ³  ν•΄λ‹Ή μš”μ²­μ„ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œν–ˆλ‹€λŠ” 의미, 300λ²ˆλŒ€λŠ” ν•΄λ‹Ή μš”μ²­μ„ μ™„λ£Œν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€λ₯Έ νŽ˜μ΄μ§€λ‘œ λ¦¬λ‹€μ΄λ ‰μ…˜ ν•΄μ•Όν•œλ‹€λŠ” 의미, 400λ²ˆλŒ€λŠ” ν΄λΌμ΄μ–ΈνŠΈ 츑의 였λ₯˜λ‘œ, μš”μ²­ μžμ²΄κ°€ μ˜¬λ°”λ₯΄μ§€ μ•Šλ‹€λŠ” 의미, 500λ²ˆλŒ€λŠ” μ„œλ²„μ—μ„œ 였λ₯˜κ°€ 생겨 μš”μ²­μ„ μ²˜λ¦¬ν•  수 μ—†λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. 일반적으둜 톡신이 μ„±κ³΅ν–ˆμ„ λ•Œ, 200번 그리고 ν΄λΌμ΄μ–ΈνŠΈ 츑의 μš”μ²­ λ¦¬μ†ŒμŠ€κ°€ μ„œλ²„μ— μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œμ˜ 404λ²ˆμ„ 자주 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

1. 401 (Unauthorized) 와 403 (Forbidden)은 의미적으둜 μ–΄λ–€ 차이가 μžˆλ‚˜μš”?

401λ²ˆμ€ μ‚¬μš©μžκ°€ μΈμ¦λ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ νŠΉμ • λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•  λ•Œ λ°œμƒν•˜κ³  403λ²ˆμ€ μ‚¬μš©μžκ°€ μΈμ¦λ˜μ–΄μžˆμ§€λ§Œ ν•΄λ‹Ή μ‚¬μš©μžμ—κ²ŒλŠ” λΆ€μ—¬λ˜μ§€ μ•Šμ€ κΆŒν•œμ— μ ‘κ·Όν•  λ•Œ λ°œμƒν•©λ‹ˆλ‹€. 근본적으둜 이 λ‘˜μ˜ 큰 μ°¨μ΄λŠ” ν˜„μž¬ μœ μ €κ°€ 인증이 λ˜μ–΄μžˆλŠλƒ, λ˜μ–΄μžˆμ§€ μ•ŠλŠλƒμž…λ‹ˆλ‹€.

2. 200 (ok) 와 201 (created) 의 차이에 λŒ€ν•΄ μ„€λͺ…ν•΄ μ£Όμ„Έμš”.

200λ²ˆμ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ μš”μ²­ν•œ μž‘μ—…μ΄ μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λ˜μ—ˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ 201λ²ˆλ„ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ μ„±κ³΅ν–ˆλ‹€λŠ” μ˜λ―Έμ§€λ§Œ 쒀더 λ‚˜μ•„κ°€μ„œ μ„œλ²„μ— μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€κ°€ μƒμ„±λ˜μ—ˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.κ·ΈλŸ¬λ―€λ‘œ 보톡 POST, PUT μš”μ²­ 성곡에 λŒ€ν•œ 응닡을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

3. HTTP Method 에 λŒ€ν•΄ μ„€λͺ…ν•΄ μ£Όμ„Έμš”.

HTTP λ©”μ„œλ“œλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μ–΄λ–€ μž‘μ—…μ„ μš”μ²­ν• μ§€ 즉, μ–΄λ–€ μ’…λ₯˜μ˜ μš”μ²­μΈμ§€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 일반적으둜 GET, POST, PUT, PATCH, DELETE 5κ°€μ§€μ˜ λ©”μ„œλ“œκ°€ 자주 μ‚¬μš©λ©λ‹ˆλ‹€.

1. HTTP Method의 멱등성에 λŒ€ν•΄ μ„€λͺ…ν•΄ μ£Όμ„Έμš”.

멱등성은 νŠΉμ • 연산을 1번 ν•œ 것과 μ—¬λŸ¬ 번 μ§„ν–‰ν•œ 것이 λ™μΌν•œ κ²°κ³Όλ₯Ό κ°€μ§€λŠ” μ„±μ§ˆμž…λ‹ˆλ‹€. 즉, HTTP λ©”μ„œλ“œμ˜ 멱등성은 λ™μΌν•œ μš”μ²­μ„ 1번 λ³΄λ‚΄λŠ” 것과 μ—¬λŸ¬ 번 λ³΄λ‚΄λŠ” κ²ƒμ˜ κ²°κ³Όκ°€ λ™μΌν•˜λ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 즉, λ©±λ“±μ„±μ˜ 핡심은 β€˜μ—¬λŸ¬λ²ˆ 연산을 진행해도 상관없닀.β€˜λŠ” 것에 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ GET λ©”μ„œλ“œμ˜ 경우 1번 μš”μ²­μ„ λ³΄λ‚΄κ±°λ‚˜ μ—¬λŸ¬ 번 μš”μ²­μ„ 보내도 κ·Έ κ²°κ³Όκ°€ μ–Έμ œλ‚˜ λ™μΌν•˜λ―€λ‘œ 멱등성을 κ°€μ§‘λ‹ˆλ‹€. μ΄λ ‡κ²Œ 멱등성을 κ°–λŠ” λŒ€ν‘œμ μΈ λ©”μ„œλ“œλŠ” GET, PUT, DELETEκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ°˜λŒ€λ‘œ POST와 같이 1번 보내면 μš”μ²­μ— λŒ€ν•΄ μ–΄λ–€ 데이터λ₯Ό 1번 μƒμ„±ν•˜κ³  μ—¬λŸ¬ 번 보내면 μ–΄λ–€ 데이터λ₯Ό μ—¬λŸ¬ 번 μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— λ‘˜μ˜ κ²°κ³Όκ°€ λ™μΌν•˜μ§€ μ•Šμ•„ λ©±λ“±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μΆ”κ°€λ‘œ λ°μ΄ν„°μ˜ 일뢀λ₯Ό μˆ˜μ •ν•˜λŠ” PATCH의 경우, μš”μ²­μ˜ 쑰건에 따라 λ©±λ“± μœ λ¬΄κ°€ λ‹¬λΌμ§‘λ‹ˆλ‹€. β€˜μ–΄λ–€ μœ μ €μ˜ 이메일을 νŠΉμ € μ΄λ©”μΌλ‘œ λ³€κ²½ν•˜λŠ”β€™ PATCH μš”μ²­μ˜ 경우, 1번 λ³΄λ‚΄λ‚˜ μ—¬λŸ¬ 번 λ³΄λ‚΄λ‚˜ λ™μΌν•œ μ΄λ©”μΌλ‘œ λ³€κ²½λ˜λ―€λ‘œ λ©±λ“±ν•©λ‹ˆλ‹€. κ·Έλ ‡μ§€λ§Œ β€˜νŠΉμ • μœ μ €μ˜ λ°©λ¬Έ 횟수λ₯Ό 1μ”© μ¦κ°€μ‹œν‚€λ„λ‘ λ³€κ²½ν•˜λŠ”β€™ PATCH μš”μ²­μ˜ 경우, 1번 λ³΄λ‚΄λŠ” 것과 μ—¬λŸ¬ 번 λ³΄λ‚΄λŠ” κ²ƒμ˜ κ²°κ³Όκ°€ λ‹¬λΌμ§€λ―€λ‘œ λ©±λ“±ν•˜μ§€ μ•Šκ²Œ λ©λ‹ˆλ‹€.

ꢁ금증. POSTκ°€ μ•„λ‹Œ GETμœΌλ‘œλ„ 데이터λ₯Ό μƒμ„±ν•˜λŠ” κ²½μš°λ„ μžˆλŠ” 걸둜 μ•Œκ³  μžˆλŠ”λ°, 이런 경우 GET은 멱등성이 μ—†μ–΄μ§€λŠ” 게 μ•„λ‹Œκ°€? ν•΄κ²°. GETμœΌλ‘œλ„ μ„œλ²„μ— 데이터λ₯Ό μƒμ„±ν•˜λŠ” 게 λΆˆκ°€λŠ₯ν•œ 것은 μ•„λ‹ˆλ‹€. κ·Έλ ‡μ§€λ§Œ μ—„λ°€νžˆ HTTP ν”„λ‘œν† μ½œμ—μ„œμ˜ GET λ©”μ„œλ“œλŠ” μ•ˆμ „ν•˜κ³  λ©±λ“±ν•΄μ•Όν•œλ‹€. 즉, μ• μ΄ˆμ— GET으둜 데이터λ₯Ό μƒμ„±ν•˜λŠ” μš”μ²­μ„ λ³΄λ‚΄λŠ” 것 μžμ²΄κ°€ HTTP ν”„λ‘œν† μ½œμ˜ 원칙을 κΉ¬ 것이닀. μ΄λ ‡κ²Œ 되면 μ›Ή μŠ€ν¬λž©ν•‘, μ›Ή μ„œλ²„ 둜그 뢄석, 캐싱 λ“±μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

2. GETκ³Ό POST의 μ°¨μ΄λŠ” λ¬΄μ—‡μΈκ°€μš”?

λ¨Όμ € 데이터λ₯Ό μ „μ†‘ν•˜λŠ” κ΄€μ μ—μ„œ λ§μ”€λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. GET은 URL의 μΌλΆ€λ‘œ 데이터λ₯Ό μ „μ†‘ν•˜κ³  POSTλŠ” μš”μ²­μ˜ λ³Έλ¬Έ(body)으둜 데이터λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€. 그렇기에 GET은 본문에 데이터가 λ…ΈμΆœλ˜μ–΄ λ³΄μ•ˆμ— 비ꡐ적 μ·¨μ•½ν•˜λ‹€κ³  λΈŒλΌμš°μ €μ˜ url μ œν•œμ— λ”°λ₯Έ 데이터 크기 μ œν•œμ΄ μžˆλ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€. 반면 POSTλŠ” μš”μ²­μ˜ 본문에 데이터λ₯Ό μ „μ†‘ν•˜κΈ°μ— λ³΄μ•ˆμ΄ 비ꡐ적 κ°•ν•˜κ³  데이터 크기의 μ œν•œμ΄ 비ꡐ적 μ—¬μœ λ‘­λ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμœΌλ‘œ μ•ˆμ •μ„±κ³Ό λ©±λ“±μ„±μ˜ κ΄€μ μž…λ‹ˆλ‹€. GET은 μ•ˆμ •ν•˜κ³  λ©±λ“±ν•˜κΈ° λ•Œλ¬Έμ— μ—¬λŸ¬ 번 μš”μ²­μ„ 보내도 μ„œλ²„ ν˜Ήμ€ DB의 μƒνƒœλ₯Ό λ³€κ²½μ‹œν‚€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 반면, POST의 경우 μš”μ²­μ— 따라 μ„œλ²„μ˜ μƒνƒœλ₯Ό λ³€κ²½μ‹œν‚€κΈ° λ•Œλ¬Έμ— μ•ˆμ •ν•˜κ³  λ©±λ“±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ•žμ„  νŠΉμ§•λ“€μ— 따라 GET은 주둜 데이터λ₯Ό μ‘°νšŒν•˜λŠ” 데 μ‚¬μš©λ˜κ³  POSTλŠ” μ„œλ²„μ— 데이터λ₯Ό μ „μ†‘ν•˜κ±°λ‚˜ μ„œλ²„μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ”λ° μ‚¬μš©ν•©λ‹ˆλ‹€.

3. POST와 PUT, PATCH의 μ°¨μ΄λŠ” λ¬΄μ—‡μΈκ°€μš”?

3가지 λ©”μ„œλ“œ λͺ¨λ‘ μ„œλ²„μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. λ‹€λ§Œ, POSTλŠ” 주둜 μ„œλ²„μ— μƒˆλ‘œμš΄ 데이터λ₯Ό 생성할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 즉, λ©±λ“±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. PUT은 기쑴의 데이터λ₯Ό μ™„μ „νžˆ μƒˆλ‘œμš΄ μƒνƒœλ‘œ μ—…λ°μ΄νŠΈν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ 데이터λ₯Ό μƒμ„±ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. PUT의 경우 멱등성을 κ°€μ§‘λ‹ˆλ‹€. PATCHλŠ” κΈ°μ‘΄ λ°μ΄ν„°μ˜ 일뢀λ₯Ό λ³€κ²½ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œλ‘œ, μš”μ²­μ˜ ν˜•νƒœμ— 따라 λ©±λ“± μœ λ¬΄κ°€ λ‹¬λΌμ§‘λ‹ˆλ‹€. β€˜μ–΄λ–€ μœ μ €μ˜ 이메일을 νŠΉμ € μ΄λ©”μΌλ‘œ λ³€κ²½ν•˜λŠ”β€™ PATCH μš”μ²­μ˜ 경우, 1번 λ³΄λ‚΄λ‚˜ μ—¬λŸ¬ 번 λ³΄λ‚΄λ‚˜ λ™μΌν•œ μ΄λ©”μΌλ‘œ λ³€κ²½λ˜λ―€λ‘œ λ©±λ“±ν•©λ‹ˆλ‹€. κ·Έλ ‡μ§€λ§Œ β€˜νŠΉμ • μœ μ €μ˜ λ°©λ¬Έ 횟수λ₯Ό 1μ”© μ¦κ°€μ‹œν‚€λ„λ‘ λ³€κ²½ν•˜λŠ”β€™ PATCH μš”μ²­μ˜ 경우, 1번 λ³΄λ‚΄λŠ” 것과 μ—¬λŸ¬ 번 λ³΄λ‚΄λŠ” κ²ƒμ˜ κ²°κ³Όκ°€ λ‹¬λΌμ§€λ―€λ‘œ λ©±λ“±ν•˜μ§€ μ•Šκ²Œ λ©λ‹ˆλ‹€.

4. HTTP 1.1 μ΄ν›„λ‘œ, GET에도 Body에 데이터λ₯Ό 싀을 수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  μ™œ 아직도 이런 방식을 μ§€μ–‘ν•˜λŠ” κ²ƒμΌκΉŒμš”?

HTTPλŠ” μ‘μš© κ³„μΈ΅μ˜ ν”„λ‘œν† μ½œλ‘œμ„œ κ²°κ΅­ ν•˜λ‚˜μ˜ 약속이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. HTTP의 λ²„μ „κ³ΌλŠ” 상관없이 GET λ©”μ„œλ“œλŠ” μ•ˆμ •μ„±κ³Ό 멱등성을 μœ μ§€ν•΄μ•Όν•©λ‹ˆλ‹€. 즉, μ„œλ²„μ˜ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•˜λ©΄ HTTPλΌλŠ” 약속을 μ–΄κΈ°λŠ” 것이 λ©λ‹ˆλ‹€. HTTP 1.1λΆ€ν„° λͺ…μ„Έμ˜ 일관성과 μœ μ—°μ„±μ„ μœ„ν•΄ λͺ¨λ“  HTTP λ©”μ„œλ“œκ°€ μš”μ²­ 라인(request line), 헀더(header), λ³Έλ¬Έ(body) ꡬ쑰λ₯Ό κ°–κ²Œ μž‘μ„±λ˜μ—ˆμ„ 뿐, GET으둜 body에 데이터λ₯Ό λ‹΄λŠ” 게 μ˜³λ‹€λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. λ§Œμ•½ 데이터λ₯Ό μš”μ²­ λ³Έλ¬Έ(body)에 λ‹΄μ•„ GET μš”μ²­μ„ λ³΄λ‚΄κ²Œ 되면 μ›Ή μŠ€ν¬λž©ν•‘, μ›Ή μ„œλ²„ 둜그 뢄석, 캐싱 λ“±μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ§Žμ€ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ΅¬ν˜„μ²΄λŠ” λ³Έλ¬Έ(body)을 ν¬ν•¨ν•œ GET μš”μ²­μ„ λ¬΄μ‹œν•˜κ±°λ‚˜ 였λ₯˜λ₯Ό λ°˜ν™˜ν•˜κ²Œ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.