CS/λ””μžμΈ νŒ¨ν„΄

[λ””μžμΈ νŒ¨ν„΄] ν”„λ‘μ‹œ νŒ¨ν„΄(Proxy Pattern)κ³Ό ν”„λ‘μ‹œ μ„œλ²„(Proxy Server)

1eehyunji 2023. 8. 3. 18:15

https://1eehyunji.tistory.com/entry/%ED%94%84%EB%A1%9D%EC%8B%9CProxy-%EA%B0%9D%EC%B2%B4

 

ν”„λ‘μ‹œ(Proxy) 객체

ν”„λ‘μ‹œ κ°μ²΄λŠ” μ–΄λ–€ λŒ€μƒμ˜ 기본적인 λ™μž‘(속성 μ ‘κ·Ό, ν• λ‹Ή, 순회, μ—΄κ±°, ν•¨μˆ˜ 호좜 λ“±)의 μž‘μ—…μ„ κ°€λ‘œμ±„μ„œ νŠΉλ³„ν•œ λ‹€λ₯Έ λ™μž‘(트랩)을 ν•  수 있게 ν•˜λŠ” 객체λ₯Ό λœ»ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν”„λ‘μ‹œ

1eehyunji.tistory.com

μ•žμ„œ μž‘μ„±ν–ˆλ˜ κΈ€μ˜ ν”„λ‘μ‹œ κ°μ²΄λŠ” λ””μžμΈ νŒ¨ν„΄ 쀑 ν•˜λ‚˜μΈ ν”„λ‘μ‹œ νŒ¨ν„΄μ˜ κ°œλ…μ΄ λ…Ήμ•„λ“€μ–΄ μžˆλŠ” 객체이닀.

 

ν”„λ‘μ‹œ νŒ¨ν„΄μ€ λŒ€μƒ 객체에 μ ‘κ·Όν•˜κΈ° μ „ κ·Έ 접근에 λŒ€ν•œ 흐름을 κ°€λ‘œμ±„μ„œ λŒ€μƒ 객체 μ•žλ‹¨μ˜ μΈν„°νŽ˜μ΄μŠ€ 역할을 ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.

즉, μ–΄λ–€ λŒ€μƒ 객체에 μ ‘κ·Όν•˜κ³ μž ν•  λ•Œ ν•΄λ‹Ή 객체λ₯Ό μ§μ ‘μ μœΌλ‘œ μ ‘κ·Όν•˜λŠ” 것이 μ•„λ‹ˆλΌ ν•΄λ‹Ή 객체에 λŒ€μ‘ν•˜λŠ” 'λŒ€λ¦¬μΈ' 역할을 ν•˜λŠ” 객체λ₯Ό 톡해 λŒ€μƒ 객체에 μ ‘κ·Όν•˜λŠ” 방식이닀. 

 

ν”„λ‘μ‹œ νŒ¨ν„΄μ˜ 적용 사둀

  • Access Control / Validation
    • ν΄λΌμ΄μ–ΈνŠΈκ°€ μ–΄λ–€ 객체에 μ ‘κ·Όν•΄μ•Ό ν•˜λŠ”λ°, λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μƒ 좔가적인 검증이 ν•„μš”ν•œ 경우
    • 좔가적인 κ²€μ¦μ˜ μ˜ˆμ‹œ)
      • μ–΄λ–€ μœ μ €κ°€ νŠΉμ • 지역에 μžˆμ„ λ•ŒλŠ” 접근을 λͺ»ν•˜κ²Œ ν•œλ‹€. 
      • μ–΄λ–€ μœ μ €κ°€ 객체에 μ ‘κ·Όν•  수 μžˆλŠ” κΆŒν•œμ΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
  • Caching / Logging
    • μ–΄λ–€ 객체에 데이터λ₯Ό μš”μ²­ν•  λ•Œ, ν”„λ‘μ‹œ 객체에 Caching λ‘œμ§μ„ μΆ”κ°€μ μœΌλ‘œ μ μš©ν•˜λŠ” 경우
    • λŒ€μƒ 객체와 μš”μ²­ κ΅ν™˜μ„ ν•  λ•Œλ§ˆλ‹€ ν”„λ‘μ‹œ 객체가 Logging을 ν•˜λŠ” 경우
  • Credit / Check Card(banking)
    • μ–΄λ–€ 물건을 μΉ΄λ“œλ‘œ κ΅¬μž…ν•˜λŠ” 경우 μΉ΄λ“œκ°€ ν”„λ‘μ‹œ 역할을 ν•΄μ£Όκ³ , ν˜„κΈˆμ΄ λŒ€μƒ 객체가 λ˜λŠ” 경우

 

ν”„λ‘μ‹œ μ„œλ²„(Proxy Server)

ν”„λ‘μ‹œ μ„œλ²„λŠ” μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μžμ‹ μ„ 톡해 λ‹€λ₯Έ λ„€νŠΈμ›Œν¬ μ„œλΉ„μŠ€μ— κ°„μ ‘μ μœΌλ‘œ 접속할 수 있게 ν•΄μ£ΌλŠ” 컴퓨터 μ‹œμŠ€ν…œμ΄λ‚˜ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ 가리킨닀.

λŒ€ν‘œμ μœΌλ‘œ nginx, CloudFlare 등이 μžˆλ‹€.

 

nginx

nginxλŠ” 비동기 이벀트 기반의 ꡬ쑰와 λ‹€μˆ˜μ˜ 연결을 효과적으둜 처리 κ°€λŠ₯ν•œ μ›Ή μ„œλ²„μ΄λ‹€. 주둜, Node.js μ„œλ²„ μ•žλ‹¨μ˜ ν”„λ‘μ‹œ μ„œλ²„λ‘œ ν™œμš©ν•œλ‹€.

이λ₯Ό 톡해 읡λͺ… μ‚¬μš©μžκ°€ μ§μ ‘μ μœΌλ‘œ μ„œλ²„μ— μ ‘κ·Όν•˜λŠ” 것을 μ°¨λ‹¨ν•˜κ³ , κ°„μ ‘μ μœΌλ‘œ ν•œ 단계 더 거치게 λ§Œλ“€μ–΄μ„œ λ³΄μ•ˆμ„ κ°•ν™”ν•  수 μžˆλ‹€.

CloudFlare

CloudFlareλŠ” μ „ μ„Έκ³„μ μœΌλ‘œ λΆ„μ‚°λœ μ„œλ²„κ°€ 있고, 이λ₯Ό 톡해 μ–΄λ–€ μ‹œμŠ€ν…œμ˜ μ½˜ν…μΈ  전달을 λΉ λ₯΄κ²Œ ν•  수 μžˆλŠ” CDN μ„œλΉ„μŠ€μ΄λ‹€.

*CDN(Content Delivery Network) : 각 μ‚¬μš©μžκ°€ 인터넷에 μ ‘μ†ν•˜λŠ” κ³³κ³Ό κ°€κΉŒμš΄ κ³³μ—μ„œ μ½˜ν…μΈ λ₯Ό 캐싱 λ˜λŠ” λ°°ν¬ν•˜λŠ” μ„œλ²„ λ„€νŠΈμ›Œν¬μ΄λ‹€. 이λ₯Ό 톡해 μ‚¬μš©μžκ°€ μ›Ή μ„œλ²„λ‘œλΆ€ν„° μ½˜ν…μΈ λ₯Ό λ‹€μš΄λ‘œλ“œν•˜λŠ” μ‹œκ°„μ„ 쀄일 수 μžˆλ‹€. 

 

CloudFlareλŠ” μ›Ή μ„œλ²„ μ•žλ‹¨μ— ν”„λ‘μ‹œ μ„œλ²„λ‘œ 두고 DDOS 곡격(짧은 μ‹œκ°„λ™μ•ˆ λ„€νŠΈμ›Œν¬μ— λ§Žμ€ μš”μ²­μ„ λ³΄λ‚΄μ„œ λ„€νŠΈμ›Œν¬λ₯Ό λ§ˆμ‹œν‚€κ³  μ›Ήμ˜ κ°€μš©μ„±μ„ λ°©ν•΄ν•˜λŠ” 사이버 곡격) λ°©μ–΄λ‚˜ HTTPS ꡬ좕에 쓰인닀. 또, μ„œλΉ„μŠ€λ₯Ό λ°°ν¬ν•œ 이후에 ν•΄μ™Έμ—μ„œ μ˜μ‹¬μŠ€λŸ¬μš΄ νŠΈλž˜ν”½μ΄ 많이 λ°œμƒν•˜λ©΄ 이 λ•Œλ¬Έμ— ν΄λΌμš°λ“œ μ„œλΉ„μŠ€ λΉ„μš©μ΄ 많이 λ°œμƒν•  μˆ˜λ„ μžˆλŠ”λ° μ΄λ•Œ CloudFlareκ°€ μ˜μ‹¬μŠ€λŸ¬μš΄ νŠΈλž˜ν”½μΈμ§€ λ¨Όμ € νŒλ‹¨ν•΄μ„œ CAPTCHA 등을 기반으둜 이λ₯Ό 일정 λΆ€λΆ„ λ§‰μ•„μ£ΌλŠ” 역할도 μˆ˜ν–‰ν•œλ‹€.

μ•žμ˜ 그림처럼 μ‚¬μš©μž, 크둀러, κ³΅κ²©μžκ°€ μžμ‹ μ˜ μ›Ή μ‚¬μ΄νŠΈλ₯Ό μ ‘μ†ν•˜κ²Œ 되면 μ΄λ•Œ CloudFlareλ₯Ό ν”„λ‘μ‹œ μ„œλ²„λ‘œ λ‘μ–΄μ„œ κ³΅κ²©μžλ‘œλΆ€ν„° μ›Ή μ„œλ²„λ₯Ό λ³΄ν˜Έν•  수 μžˆλ‹€.

 

CORS와 ν”„λ‘ νŠΈμ—”λ“œμ˜ ν”„λ‘μ‹œ μ„œλ²„

CORS(Cross Origin Resource Sharing)λŠ” μ„œλ²„κ°€ μ›Ή λΈŒλΌμš°μ €μ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό λ‘œλ“œν•  λ•Œ λ‹€λ₯Έ μ˜€λ¦¬μ§„(ν”„λ‘œν† μ½œκ³Ό 호슀트 이름, 포트의 μ‘°ν•© ex : https://kundol.com:12010)을 ν†΅ν•΄μ„œ λ‘œλ“œν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜λŠ” HTTP 헀더 기반의 λ©”μ»€λ‹ˆμ¦˜μ΄λ‹€. 

예λ₯Ό λ“€μ–΄, ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ 127.0.0.1:3000으둜 ν…ŒμŠ€νŒ…μ„ ν•˜λŠ”λ° λ°±μ—”λ“œ μ„œλ²„λŠ” 127.0.0.1:12010이라면 포트 λ²ˆν˜Έκ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— CORS μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. 

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό λ§Œλ“€κΈ°λ„ ν•œλ‹€. 즉, ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ΄μš©ν•΄μ„œ ν”„λ‘ νŠΈμ—”λ“œ μ„œλ²„μ—μ„œ μš”μ²­λ˜λŠ” μ˜€λ¦¬μ§„μ„ 127.0.0.1:12010으둜 λ°”κΎΈλŠ” 것이닀. 

μœ„ 그림처럼 ν”„λ‘ νŠΈμ—”λ“œ μ„œλ²„ μ•žλ‹¨μ— ν”„λ‘μ‹œ μ„œλ²„λ₯Ό λ‘¬μ„œ μ˜€λ¦¬μ§„μ„ λ°±μ—”λ“œ μ„œλ²„μ™€ λ™μΌν•˜κ²Œ λ°”κΏ”μ£Όμ–΄ API μš”μ²­μ„ κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.