1. HTTPλ?
HTTP(HyperText Transfer Protocol)λ μΉ λΈλΌμ°μ μ μλ²κ° μλ‘ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ λ μ¬μ©νλ κ·μΉ(νλ‘ν μ½) μ λλ€.
- μ¬μ©μλ λΈλΌμ°μ μμ μ£Όμλ₯Ό μ λ ₯νκ±°λ λ²νΌμ ν΄λ¦
- λΈλΌμ°μ λ μλ²μκ² μμ²(request)μ μ μ‘
- μλ²λ μμ²μ μ²λ¦¬ν ν, μλ΅(response)μ μ μ‘
μ΄λ “μμ²κ³Ό μλ΅μ μ΄λ€ νμμΌλ‘ μ£Όκ³ λ°μμ§”λ₯Ό μ ν΄λμ μ½μμ΄ λ°λ‘ HTTP μ λλ€.
2. HTTP λ©μλμ Idempotent
HTTP μμ²μλ “μ΄ μμ²μΌλ‘ 무μμ νκ³ μΆμμ§”λ₯Ό λνλ΄λ λμ¬κ° μμ΅λλ€.
μ΄κ²μ΄ λ°λ‘ HTTP λ©μλ(Method) μ λλ€.
2-1. μμ£Ό μ°λ HTTP λ©μλ
GET
- μλ²μ 리μμ€λ₯Ό μ‘°νν λ μ¬μ©
- ex) κ²μκΈ λͺ©λ‘ κ°μ Έμ€κΈ°, νΉμ κΈ μμΈ μ‘°ν λ±
POST
- μλ²μ μλ‘μ΄ λ¦¬μμ€λ₯Ό μμ±ν λ μ¬μ©
- ex) νμκ°μ , κΈ μμ± λ±
PUT
- 리μμ€λ₯Ό ν΅μ§Έλ‘ μμ (μΉν)ν λ μ¬μ©
- ex) κ²μκΈ μ 체λ₯Ό μλ‘μ΄ λ΄μ©μΌλ‘ λ°κΎΈκΈ°
PATCH
- 리μμ€λ₯Ό λΆλΆμ μΌλ‘ μμ ν λ μ¬μ©
- ex) κ²μκΈ μ λͺ© μμ
DELETE
- 리μμ€λ₯Ό μμ ν λ μ¬μ©
2-2. Idempotent(λ©±λ±μ±) μ΄λ?
λ©±λ±(Idempotent) μ΄λΌλ “κ°λ μ κ°μ μμ²μ μ¬λ¬ λ² λ³΄λ΄λ κ²°κ³Όκ° λ¬λΌμ§μ§ μλ μ±μ§”μ μλ―Έν©λλ€.
μλ₯Ό λ€μ΄ DELETE/posts/1 μμ²μ΄ μ€λ κ²½μ°
- 첫 λ²μ§Έ μμ²: 1λ² κΈ μμ
- λ λ²μ§Έ μμ²: μ΄λ―Έ κΈμ΄ μμ λ μνλΌ μμ ν λμμ΄ μμ. κ²°κ³Όμ μΌλ‘ μλ²μ μνλ “μμ λ μν”λ‘ λ³νμ§ μμ
⇒ μ¦, μ¬λ¬ λ² μμ²ν΄λ μ΅μ’ μνκ° κ°μ΅λλ€. μ΄λ° λ©μλλ λ©±λ±νλ€κ³ ν©λλ€.
λ³΄ν΅ POSTλ₯Ό μ μΈν λ€λ₯Έ λ©μλλ€μ λ©±λ±νλ€κ³ ν©λλ€.
- GET /posts/1μ 10λ² νΈμΆν΄λ μ‘°νλ§ νλ―λ‘ λ°μ΄ν°λ λ³νμ§ μμ
- POST /paymentsλ₯Ό 10λ² νΈμΆνλ©΄ κ²°μ κ° 10λ² μΌμ΄λ μ μμ
HTTP κΈ°μ€ POSTλ₯Ό μ μΈν λ©μλλ λ©±λ±νκ² μ€κ³λμ΄ μμ΅λλ€.
νμ§λ§ μ€μ μλ² κ΅¬νμμ GET νΈμΆλ§λ€ μ‘°νμλ₯Ό μ¦κ°μν€κ±°λ, DELETE μλ§λ€ λ‘κ·Έλ₯Ό μΆκ°νλ©΄ λ©±λ±μ±μ΄ κΉ¨μ§ μ μμ΅λλ€.
μ¦, λ©±λ±μ±μ λ©μλ μ체μ νΉμ§μ΄λΌκΈ°λ³΄λ€, κ°μ μμ²μ΄ μλ² μνλ₯Ό λ³νμν€μ§ μλλ‘ κ΅¬ννλ κ²μ΄ ν΅μ¬μ λλ€.
μ λ©±λ±μ±μ΄ μ€μν κΉμ?
- λ€νΈμν¬ μ₯μ λ‘ μΈν΄ μμ²μ΄ μ€λ³΅λ μ μμ
- μλ² λλ ν΄λΌμ΄μΈνΈμμ μ¬μλ λ‘μ§μ λ£μ μ μμ
⇒ μ΄λ λ©μλλ₯Ό μ¬λ¬ λ² νΈμΆν΄λ λλμ§λ₯Ό νλ¨νλ κΈ°μ€μ΄ λ©±λ±μ±μ λλ€.
3. HTTP/1.1, HTTP/2, HTTP/3μ μ°¨μ΄
HTTPλ λ²μ μ΄ μ¬λΌκ°λ©΄μ μ±λ₯κ³Ό ν¨μ¨μ΄ κ°μ λμμ΅λλ€.
3-1. HTTP/1.1
- ν
μ€νΈ κΈ°λ° νλ‘ν μ½
- μμ²/μλ΅ ν€λκ° μ¬λμ΄ μ½μ μ μλ ν μ€νΈ ννμ λλ€.
- κΈ°λ³Έμ μΌλ‘ Keep-Alive μ§μ
- νλμ TCP μ°κ²°μ μ¬λ¬ μμ²μ μ¬μ¬μ©ν μ μμ΅λλ€.
- λ¨μ : HOL(Head Of Line) Blocking
- λΈλΌμ°μ κ° μ¬λ¬ 리μμ€(HTML, CSS, JS, μ΄λ―Έμ§ λ±)λ₯Ό λ°μμμΌ ν λ ν μ°κ²°μμ μμ²μ μμλλ‘ μ²λ¦¬νλ€ λ³΄λ μ μμ²μ΄ λλ €μ§λ©΄ λ€ μμ²λ κ°μ΄ λλ €μ§λ λ¬Έμ κ° μμ΅λλ€.
- μ΄ λλ¬Έμ λΈλΌμ°μ λ λ³΄ν΅ λλ©μΈλΉ μ¬λ¬ κ°μ TCP μ°κ²°μ μ΄μ΄ ν΄κ²°νλ € νμ΅λλ€.
3-2. HTTP/2
HTTP/2λ ν μ°κ²°λ‘ μ¬λ¬ μμ²μ λμμ μ²λ¦¬νλ κ²μ μ΄μ μ λ§μΆ λ²μ μ λλ€.
- Binary νλ‘ν μ½
- ν μ€νΈκ° μλ μ΄μ§(binary) νμμΌλ‘ ν΅μ ν©λλ€.
- νμ± μλκ° λΉ λ₯΄κ³ ν¨μ¨μ μ λλ€.
- Multiplexing(λ€μ€ν)
- νλμ TCP μ°κ²° μμμ μ¬λ¬ μμ²κ³Ό μλ΅μ λμμ μ²λ¦¬ν μ μμ΅λλ€.
- HTTP/1.1μμ λ°μνλ HOL Blocking λ¬Έμ κ° μνλ©λλ€.
- Header Compression
- λ§€ μμ²λ§λ€ ν° ν€λλ₯Ό μμΆν΄μ μ μ‘ν©λλ€.
- λ€νΈμν¬ μ¬μ©λμ΄ μ€μ΄λλλ€.
- Server Push
- μλ²κ° ν΄λΌμ΄μΈνΈκ° μμ²νμ§ μμ 리μμ€λ₯Ό λ¨Όμ 보λ΄μ€ μ μλ κΈ°λ₯μ λλ€.
- μ€μ λ‘ μΊμ, μ€λ³΅ λ¬Έμ λ±μ μ΄μ λ‘ λ§μ΄ μ¬μ©λμ§λ μμ΅λλ€.
3-3. HTTP/3
HTTP/3λ TCP λμ QUIC(UDP κΈ°λ° νλ‘ν μ½)μ μ¬μ©νμ¬ μ°κ²° μ±λ₯μ λ κ°μ ν λ²μ μ λλ€.
- TCPκ° μλ QUIC μ¬μ©
- TCPμ μ°κ²° μ€μ , νΌμ‘ μ μ΄, μ¬μ μ‘ λ±μμ μ€λ μ§μ°μ μ€μ΄κΈ° μν λͺ©μ μ λλ€.
- λΉ λ₯Έ μ°κ²° μ€μ
- TLSμ μ°κ²° μ€μ μ ν©μ³ λ λΉ λ₯΄κ² ν΅μ μ μμν μ μμ΅λλ€.
- TLSλ 'Transport Layer Security'μ μ½μλ‘, μΈν°λ· μμ ν΅μ λ°μ΄ν°λ₯Ό μνΈννμ¬ λ³΄νΈνλ 보μ νλ‘ν μ½
- TLSμ μ°κ²° μ€μ μ ν©μ³ λ λΉ λ₯΄κ² ν΅μ μ μμν μ μμ΅λλ€.
- HOL Blocking λ¬Έμ μΆκ°
- TCPλ ν¨ν·μ΄ μ€κ°μ μ μ€λλ©΄ ν΄λΉ ν¨ν·μ΄ μ¬μ μ‘λ λκΉμ§ λ€μ μ¨ ν¨ν·λ€λ λκΈ°ν΄μΌ ν©λλ€.
- QUICμ μ€νΈλ¦Ό λ¨μλ‘ μ²λ¦¬λκΈ° λλ¬Έμ νλμ μ€νΈλ¦Όμμ ν¨ν·μ΄ μ μ€λμ΄λ λ€λ₯Έ μ€νΈλ¦Όμ μν₯μ λ μ€λλ€.
4. Keep-Aliveλ?
HTTP/1.0 μμ μμ²μ΄ μ€λ©΄ TCP μ°κ²°μ μμ±νκ³ , μλ΅μ΄ μλ£λλ©΄ TCP μ°κ²°μ μ’ λ£μν€λ κ³Όμ μ λ°λ³΅νμ΅λλ€. νμ§λ§ TCP μ°κ²°μ μ΄κ³ λ«λ κ²μ λΉμ©μ΄ λ§μ΄ λλλ€.
κ·Έλμ λ±μ₯ν κ²μ΄ Keep-Aliveμ λλ€. νλμ TCP μ°κ²°μ μ¬λ¬ μμ²μμ μ¬μ¬μ©ν©λλ€.
TCP μ°κ²° μμ±μλ 3-way handshakeκ° νμν©λλ€. μ΄ κ³Όμ μ λ°λ³΅νλ©΄ μ§μ° μκ°μ΄ λμ΄λκ³ λΆνκ° μ»€μ§λλ€.
κ·Έλμ Keep-Aliveλ₯Ό μ¬μ©νλ©΄ ν λ² μ°κ²°ν ν μ¬λ¬ HTTP μμ²μ κ°μ μ°κ²°λ‘ λ³΄λΌ μ μμΌλ―λ‘ μ±λ₯μ΄ ν₯μλ©λλ€.
5. HTTP vs HTTPS
HTTPλ μνΈνλμ§ μμ νλ¬Έ ν΅μ μ λλ€. μ€κ°μμ ν¨ν·μ κ°λ‘μ±λ©΄, μμ² λ΄μ©κ³Ό μλ΅ λ΄μ©μ κ·Έλλ‘ λ³Ό μ μμ΅λλ€.
HTTPSλ HTTP μμ TLS(μ SSL) κ³μΈ΅μ μ¬λ € μνΈνλ ν΅μ μ ν©λλ€. μ€κ°μμ ν¨ν·μ κ°λ‘μ±λλΌλ μνΈν λμ΄μκΈ° λλ¬Έμ λ΄μ©μ ν΄μν μ μμ΅λλ€.
TLS Handsahke
- Client Hello
- ν΄λΌμ΄μΈνΈμμ μλ²μκ² μ¬κΈ°μλ ν΄λΌμ΄μΈνΈμμ μ¬μ© κ°λ₯ν TLS λ²μ , μλ² λλ©μΈ, μΈμ μλ³μ, μνΈ μ€μ λ±μ μ 보λ₯Ό ν¬ν¨ν΄μ μ μ‘
- Server Hello
- μλ²κ° ClientHello λ©μμ§μ μ 보 μ€ μλ²μμ μ¬μ©νκΈ°λ‘ μ νν TLS λ²μ , μΈμ μλ³μ, μνΈ μ€μ λ±μ μ 보λ₯Ό ν¬ν¨ν΄ μλ΅
- μΈμ¦μ μ μ‘
- μΈμ¦μ κ²μ¦
- ν΄λΌμ΄μΈνΈλ μλ²κ° λ³΄λΈ μΈμ¦μλ₯Ό νμΈνκ³ , μ λ’°ν μ μλ μΈμ¦ κΈ°κ΄μμ λ°κΈλ°μ κ²μΈμ§ κ²μ¦
- λμΉν€ μμ± λ° κ³΅μ
- ν΄λΌμ΄μΈνΈμ μλ²λ μ΅μ’ μ μΌλ‘ λμΉν€(κ°μ ν€)λ₯Ό 곡μ
- μ΄ ν€λ‘ μ΄νμ HTTP μμ²/μλ΅μ μνΈ
- μνΈνλ λ°μ΄ν° μ μ‘ μμ
6. CORS(Cross-Origin Resource Sharing) λ?
λΈλΌμ°μ λ 보μ μ μ΄μ λ‘ λ€λ₯Έ μΆμ²λ‘μ μμ²μ μ νμ λ‘λλ€. μ¬κΈ°μ μΆμ²λ λ€μ 3κ°μ§λ₯Ό ν©μΉ κ²μ λλ€.
- νλ‘ν μ½ (http/https)
- λλ©μΈ (example.com)
- ν¬νΈ (:8080 λ±)
μ΄ μΈ κ°μ§ μ€ νλλΌλ λ€λ₯΄λ©΄ λ€λ₯Έ μΆμ²λ‘ κ°μ£Όν©λλ€.
κ·Έλ°λ° μ€μ μΉ μλΉμ€μλ λ€λ₯Έ μΆμ²λ‘ μμ²ν΄μΌ νλ κ²½μ°κ° λ§μ΅λλ€.
κ·Έλμ CORSλ 보μ λλ¬Έμ μ°¨λ¨λ cross-origin μμ²μ λΈλΌμ°μ κ° νμ©ν μ μλλ‘ μλ²κ° ‘μ΄ μμ²μ νμ©ν΄λ λλ€’λ μ 보λ₯Ό λͺ μμ μΌλ‘ μ 곡νλ λ©μ»€λμ¦ μ λλ€.
6-1. CORS μλ¬κ° λ°μνλ μ΄μ
CORS μλ¬κ° λ°μνλ μ΄μ λ λΈλΌμ°μ κ° μλ΅μ λ§κΈ° λλ¬Έμ λλ€.
νλ¦μ λ€μ μ 리ν΄λ³΄λ©΄,
- νλ‘ νΈκ° μλ²μ μμ²μ 보λ λλ€.
- μλ²λ μ μμ μΌλ‘ μλ΅μ 보λμ μ μμ΅λλ€.
- νμ§λ§ μλ΅ ν€λμ Access-Control-Allow-Origin: http://localhost:3000 κ°μ νμ© μ¦κ±°κ° μλ€λ©΄,
- λΈλΌμ°μ κ° μλ΅ κ²°κ³Όλ₯Ό μλ°μ€ν¬λ¦½νΈμ μ λ¬νμ§ μμ΅λλ€.
κ·Έλμ κ°λ°μ λꡬμμλ CORS μλ¬κ° λ΄λλ°, μλ² λ‘κ·Έλ λ©μ©‘ν μν©μ΄ λ§μ΄ λ°μν©λλ€.
6-2. CORS ν΄κ²° λ°©λ²
CORS λ¬Έμ λ₯Ό ν΄κ²°νλ €λ©΄, μλ²κ° λΈλΌμ°μ μκ² μ΄λ κ² λ§ν΄μ€μΌ ν©λλ€.
“μ΄ originμ λ΄κ° μ λ’°νκ³ νμ©νλ κ³³μ λλ€.”
μ΄λ μλ΅ ν€λμ λ€μ κ°λ€μ μΆκ°ν©λλ€.
- μ΄λ€ originμ νμ©ν μ§ λͺ
μ
- Access-Control-Allow-Origin: https://example.com
- λλ κ°λ° λ¨κ³μμλ *λ‘ λͺ¨λ μΆμ² νμ©
- μ€μ μλΉμ€μμλ 보μμμ μ΄μ λ‘ μ¬μ©νμ§ μμ
- νμ©ν λ©μλμ ν€λ λͺ
μ
- Access-Control-Allow-Methods: GET, POST, PUT, DELETE
- Access-Control-Allow-Headers: Content-Type, Authorization
- ν¬λ¦¬λ΄μ
(μΏ ν€) ν¬ν¨ μμ² μ
- Access-Control-Allow-Credentials: true
- μ΄ κ²½μ° Allow-Originμ *λ₯Ό μΈ μ μκ³ μ νν λλ©μΈμ μ§μ ν΄μΌ ν©λλ€.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true);
}
}