webserv
πŸ™ˆ

webserv

Created
Jan 17, 2024 03:30 AM
Last edited time
Last updated March 15, 2024
Tags
42
Language
C++
URL

μ„œλ²„(Server)λž€??

컴퓨터 λ„€νŠΈμ›Œν¬μ—μ„œ λ‹€λ₯Έ 컴퓨터에 λŒ€ν•΄ μžμ‹ μ΄ κ°–κ³  μžˆλŠ” κΈ°λŠ₯μ΄λ‚˜ μ„œλΉ„μŠ€, 데이터 등을 μ œκ³΅ν•˜λŠ” 컴퓨터 λ˜λŠ” 그와 같은 κΈ°λŠ₯을 가진 μ†Œν”„νŠΈμ›¨μ–΄ 라고 ν•œλ‹€. ex) Apache Server && Nginx, IIS(Windows μ „μš© Web μ„œλ²„) λ“±

webserver λž€??

ν•˜λ“œμ›¨μ–΄ μΈ‘λ©΄

  • μ›Ήμ‚¬μ΄νŠΈμ˜ μ»΄ν¬λ„ŒνŠΈ νŒŒμΌλ“€μ„ μ €μž₯ν•˜λŠ” 컴퓨터
  • μ»΄ν¬λ„ŒνŠΈ 파일 β†’ HTML, Images, CSS, JavaScript…
  • μ»΄ν¬λ„ŒνŠΈ νŒŒμΌμ„ 인터넷을 톡해 ν΄λΌμ΄μ–ΈνŠΈμ— 전달

μ†Œν”„νŠΈμ›¨μ–΄ μΈ‘λ©΄

  • μ‚¬μš©μžκ°€ μ–΄λ–»κ²Œ 호슀트 νŒŒμΌλ“€μ— μ ‘κ·Όν•˜λŠ”μ§€ 관리
  • μ›Ή μ„œλ²„λŠ” μ£Όμ†Œ HTTP ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ 처리 및 응닡
notion image
Β 
πŸ’‘
λΈŒλΌμš°μ €κ°€ μ›Ή μ„œλ²„μ—μ„œ λΆˆλ €μ§„ νŒŒμΌμ„ ν•„μš”λ‘œ ν• λ•Œ, HTTPλ₯Ό 톡해 νŒŒμΌμ„ μš”μ²­ν•˜κ³ , μš”μ²­μ΄ μ˜¬λ°”λ₯Έ μ›Ή μ„œλ²„(ν•˜λ“œμ›¨μ–΄)에 λ„λ‹¬ν–ˆμ„λ•Œ, HTTPμ„œλ²„(software)λŠ” μš”μ²­ λ¬Έμ„œλ₯Ό HTTPλ₯Ό μ΄μš©ν•΄ 보내쀀닀.
Β 

정적 μ›Ή μ„œλ²„

HTTP μ„œλ²„(μ†Œν”„νŠΈμ›¨μ–΄)κ°€ μžˆλŠ” 컴퓨터(ν•˜λ“œμ›¨μ–΄)둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€. μ„œλ²„κ°€ λΆˆλ €μ§„ νŒŒμΌμ„ ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €)μ—κ²Œ μ „μ†‘ν•œλ‹€.
Β 

동적 μ›Ή μ„œλ²„

정적 μ›Ή μ„œλ²„μ™€ 좔가적인 μ†Œν”„νŠΈμ›¨μ–΄(일반적으둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ™€ λ°μ΄ν„°λ² μ΄μŠ€)둜 κ΅¬μ„±λœλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„κ°€ HTTP μ„œλ²„λ₯Ό 톡해 ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €)μ—κ²Œ λΆˆλ €μ§„ νŒŒμΌλ“€μ„ μ „μ†‘ν•˜κΈ° 전에 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„κ°€ μ—…λ°μ΄νŠΈν•œλ‹€.
WAS(Web Application Server) λ₯Ό 톡해 κ²°κ³Όκ°€ 이루어진닀. μΆ”ν›„ WAS에 λŒ€ν•΄ λ”°λ‘œ μžμ„Ένžˆ κ³΅λΆ€ν•΄λ³΄μž.
Β 

μ»΄ν¬λ„ŒνŠΈ 파일

기술적으둜, 컴퓨터에 μžˆλŠ” νŒŒμΌλ“€μ„ 뢈러올 수 μžˆμ§€λ§Œ, 그것듀을 μ „λ‹΄ν•˜λŠ” μ›Ή μ„œλ²„μ— μ €μž₯ν•˜λŠ” 것이 더 νŽΈλ¦¬ν•˜λ‹€.
Β 

μ „λ‹΄ν•˜λŠ” μ›Ήμ„œλ²„

  • 항상 μ‹€ν–‰ 쀑
  • 항상 인터넷에 μ—°κ²° λ˜μ–΄μžˆλ‹€.
  • 항상 같은 IPλ₯Ό 가지고 μžˆλ‹€.
  • 제 3μžμ— μ˜ν•΄ μœ μ§€λ³΄μˆ˜ λœλ‹€.
Β 

과제 진행

πŸ™Š 에코 μ„œλ²„ κ΅¬ν˜„

Nginx Configuration

μ˜ˆμ‹œ 파일
user www www; ## Default: nobody worker_processes 5; ## Default: 1 error_log logs/error.log; pid logs/nginx.pid; worker_rlimit_nofile 8192; events { worker_connections 4096; ## Default: 1024 } http { include conf/mime.types; include /etc/nginx/proxy.conf; include /etc/nginx/fastcgi.conf; index index.html index.htm index.php; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; tcp_nopush on; server_names_hash_bucket_size 128; # this seems to be required for some vhosts server { # php/fastcgi listen 80; server_name domain1.com www.domain1.com; access_log logs/domain1.access.log main; root html; location ~ \.php$ { fastcgi_pass 127.0.0.1:1025; } } }
Β 

기반 λͺ¨λ“ˆ

μ—”μ§„μ—‘μŠ€μ˜ 기본적인 κΈ°λŠ₯을 가진 λ§€κ°œλ³€μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆλŠ” μ§€μ‹œμ–΄λ₯Ό μ œκ³΅ν•œλ‹€.
  • 핡심 λͺ¨λ“ˆ (core module): ν”„λ‘œμ„ΈμŠ€ κ΄€λ¦¬λ‚˜ λ³΄μ•ˆ 같은 ν•„μˆ˜ κΈ°λŠ₯ 및 μ§€μ‹œμ–΄λ‘œ 이루어진닀.
  • 이벀트 λͺ¨λ“ˆ(event module): λ„€νŠΈμ›Œν‚Ή κΈ°λŠ₯의 λ‚΄λΆ€ λ™μž‘ 방식을 κ΅¬μ„±ν•œλ‹€.
  • ꡬ성 λͺ¨λ“ˆ(configuration module): ꡬ성을 μ™ΈλΆ€ νŒŒμΌμ—μ„œ 가져와 ν¬ν•¨μ‹œν‚¨λ‹€.(include)
Β 

핡심 λͺ¨λ“ˆ μ§€μ‹œμ–΄

μ§€μ‹œμ–΄
μ„€λͺ…
user
user username groupname; user username; κΈ°λ³Έκ°’: 컴파일 ν•  λ•Œ κ²°μ • μž‘μ—…μž ν”„λ‘œμ„ΈμŠ€ (worker process)λ₯Ό μ‹œμž‘μ‹œν‚€λŠ” μ‚¬μš©μž 계정과 그룹을 지정할 수 μžˆλ‹€. groupname μƒλž΅ μ‹œ userκ°€ μ‚¬μš©λœλ‹€. user root root; λŠ” λ³΄μ•ˆμƒ μœ„ν—˜ν•˜λ‹€.
worker_process
κΈ°λ³Έκ°’: 1 μž‘μ—…μž ν”„λ‘œμ„ΈμŠ€(worker_process)의 수λ₯Ό μ •μ˜ν•œλ‹€. 보톡 CPU의 μ½”μ–΄ 수만큼 ν• λ‹Ήν•˜λŠ” 것이 μ’‹μœΌλ©°, ν™•μ‹€ν•˜μ§€ μ•Šμ€ 경우 autoλ₯Ό μž…λ ₯ν•˜μ—¬ μžλ™ 감지λ₯Ό μ‹œλ„ν•  수 μžˆλ‹€. NginxλŠ” ν•˜λ‚˜μ˜ mater process와 n개의 worker process둜 κ΅¬μ„±λ˜μ–΄ μ‹€ν–‰λœλ‹€. master processλŠ” μ„€μ • νŒŒμΌμ„ 읽고, ν”„λ‘œμ„ΈμŠ€λ₯Ό μœ μ§€ 및 κ΄€λ¦¬ν•œλ‹€.λͺ¨λ“  μš”μ²­μ€ worker processμ—μ„œ μ²˜λ¦¬ν•œλ‹€. masterμ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­λ„ μ²˜λ¦¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
error_log (main, http, mail, stream, server, location μ—μ„œ μ‚¬μš© κ°€λŠ₯)
error_log /file/path level; κΈ°λ³Έκ°’: logs/err.log error level : debug, info, notice, warn, error, crit, alert, emerg 였λ₯˜ 둜그λ₯Ό 끄렀면 κ΅¬μ„±νŒŒμΌ μ΅œμƒλ‹¨μ— error_log /dev/null crit; 둜 μ§€μ •ν•œλ‹€. 파일 경둜 λŒ€μ‹  syslog, memory, stderr λ“±μœΌλ‘œ 지정할 μˆ˜λ„ μžˆλ‹€.
Β 

이벀트 λͺ¨λ“ˆ μ§€μ‹œμ–΄

μ§€μ‹œμ–΄
μ„€λͺ…
use
use kqueue; κΈ°λ³Έκ°’: μ—†μŒ μ–΄λ–€ 이벀트 λͺ¨λΈμ„ μ‚¬μš©ν• μ§€ κ²°μ •ν•œλ‹€. (nginxλŠ” μžλ™μœΌλ‘œ κ°€μž₯ μ ν•©ν•œ λͺ¨λΈμ„ μ„ νƒν•œλ‹€)
Β 

HTTP 핡심 λͺ¨λ“ˆ

πŸ’‘
http μ„œλ²„μ˜ λͺ¨λ“  기반 블둝, μ§€μ‹œμ–΄, λ³€μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ꡬ성 μš”μ†Œ, μ£Ό 블둝은 http, server, location이닀.
Β 

Flow

μ˜ˆμƒ 둜직 ν”Œλ‘œμš°μ΄λ‹€.
notion image

Request νŒŒμ‹±

Β 
πŸ’‘
key: [value] // value λŠ” LWS 둜 κ΅¬λΆ„λ˜μ–΄μ§ˆ 수 μžˆλ‹€.
Β 
일반적으둜 λ‹€μŒκ³Ό 같은 κ²½μš°μ— Base64 인코딩을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • 데이터 크기가 μž‘μ€ 경우
  • 전솑 νš¨μœ¨μ„±λ³΄λ‹€ ν˜Έν™˜μ„±μ΄ μ€‘μš”ν•œ 경우
λ‹€μŒκ³Ό 같은 κ²½μš°μ— Chunked encoding을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • 데이터 크기가 큰 경우
  • 전솑 νš¨μœ¨μ„±μ΄ μ€‘μš”ν•œ 경우
Β 
GET
πŸ’‘
일반적으둜 content-type 은 λ”°λ‘œ 넣지 μ•ŠλŠ”λ‹€.
POST
  • image/png
    • μΌλ°˜μ μ΄μ§€λŠ” μ•ŠμŒ
  • application/octet-stream
    • λ°”μ΄λ„ˆλ¦¬ 파일 전솑
  • multipart/form-data
      1. ν…μŠ€νŠΈ 데이터: ν…μŠ€νŠΈ 데이터λ₯Ό 전솑할 λ•ŒλŠ” 주둜 λ‹€μŒκ³Ό 같은 Content-Type이 μ‚¬μš©
          • text/plain: ν…μŠ€νŠΈ 데이터λ₯Ό ν‰λ¬ΈμœΌλ‘œ 전솑할 λ•Œ μ‚¬μš©
          • text/html: HTML ν˜•μ‹μ˜ ν…μŠ€νŠΈ 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©
      1. 파일 데이터: 파일 데이터λ₯Ό 전솑할 λ•ŒλŠ” 주둜 λ‹€μŒκ³Ό 같은 Content-Type이 μ‚¬μš©
          • application/octet-stream: 이진 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©
          • image/png: 이미지 νŒŒμΌμ„ 전솑할 λ•Œ μ‚¬μš©
DELETE
  • 일반적으둜 body λ‚΄μš© λ¬΄μ‹œ
Β 

헀더 μ˜ˆμ‹œ

1. text/plain

ν…μŠ€νŠΈ 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©λ˜λ©°, λ³„λ„μ˜ νƒœκ·Έ 없이 μˆœμˆ˜ν•œ ν…μŠ€νŠΈλ‘œλ§Œ κ΅¬μ„±λ©λ‹ˆλ‹€.
Content-Type: text/plain;charset=utf-8

2. text/html

HTML λ¬Έμ„œλ₯Ό 전솑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. μ›Ή νŽ˜μ΄μ§€μ˜ λ‚΄μš©μ„ μ „μ†‘ν•˜λŠ” 데 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.
Content-Type: text/html;charset=utf-8

3. multipart/form-data

파일 μ—…λ‘œλ“œλ‚˜ 폼 데이터가 파일과 ν…μŠ€νŠΈ ν•„λ“œλ₯Ό λͺ¨λ‘ 포함할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 각 뢀뢄은 κ³ μœ ν•œ 경계 λ¬Έμžμ—΄(boundary)둜 κ΅¬λΆ„λ©λ‹ˆλ‹€.
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
이 경계 λ¬Έμžμ—΄μ€ λ©”μ‹œμ§€ λ³Έλ¬Έμ—μ„œ 각 뢀뢄을 κ΅¬λΆ„ν•˜λŠ” 데 μ‚¬μš©λ˜λ©°, μ‹€μ œ μ‚¬μš©ν•  λ•ŒλŠ” κ³ μœ ν•œ 값이 μƒμ„±λ˜μ–΄ μ‚¬μš©λ©λ‹ˆλ‹€.

4. application/octet-stream

이진 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 파일 λ‹€μš΄λ‘œλ“œ 등에 μ‚¬μš©λ˜λ©°, νŠΉμ • 파일 ν˜•μ‹μ„ μ§€μ •ν•˜μ§€ μ•ŠλŠ” 일반적인 이진 데이터λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
Content-Type: application/octet-stream

5. image/png

PNG ν˜•μ‹μ˜ 이미지 νŒŒμΌμ„ 전솑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
Content-Type: image/png
Content-Type ν—€λ”λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 데이터 κ΅ν™˜μ—μ„œ 맀우 μ€‘μš”ν•œ 역할을 ν•˜λ©°, μ˜¬λ°”λ₯Έ Content-Type을 μ§€μ •ν•˜λŠ” 것은 데이터가 μ˜¬λ°”λ₯΄κ²Œ ν•΄μ„λ˜κ³  μ²˜λ¦¬λ˜λ„λ‘ ν•˜λŠ” 데 ν•„μˆ˜μ μž…λ‹ˆλ‹€.
Β 
Β 

각 method 별 처리

GET
  1. url 확인
  1. 디렉토리인가 ?
    1. YES: μ—λŸ¬
      NO: ν•΄λ‹Ή λ¦¬μ†ŒμŠ€ μžˆλŠ”μ§€ 확인
  1. λ°˜ν™˜
POST
Β 
DELETE
  1. url 확인
  1. 이상 μ—†λ‹€λ©΄ μ‚­μ œ ν›„ 200 OK
Β 

Response

μ˜ˆμ‹œ
HTTP/1.1 200 OK\r\n//status line Date: Mon, 27 Jul 2009 12:28:53 GMT\r\n// header line Server: Apache/2.2.14 (Win32)\r\n Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT\r\n Content-Length: 88\r\n Content-Type: text/html\r\n Connection: Closed\r\n \r\n// crlf <html>// body <body> <h1>Hello, World!</h1> </body> </html>
Β 

RFC

10.2.7 206 Partial Content(뢀뢄적 λ‚΄μš©).
πŸ’‘
μ„œλ²„κ°€ μžμ›μ— λŒ€ν•œ 뢀뢄적 GET μš”κ΅¬λ₯Ό μ™„λ£Œν•˜μ˜€λ‹€. 이 μš”κ΅¬λŠ” λ°˜λ“œμ‹œ μ›ν•˜λŠ” μ˜μ—­μ„ ν‘œμ‹œν•˜λŠ” Range 헀더 ν•„λ“œ(14.36 절)λ₯Ό 포함해야 ν•œλ‹€. 응닡은 이 응닡에 ν¬ν•¨λœ μ˜μ—­μ„ ν‘œμ‹œν•˜λŠ” Content-Range 헀더 ν•„λ“œ(14.17 절)λ‚˜ 각 파트의 Content-Range ν•„λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” multipart/byteranges Content-Type을 포함해야 ν•œλ‹€. multipart/byteranges λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μœΌλ©΄ μ‘λ‹΅μ˜ Content-Length 헀더 ν•„λ“œλŠ” Message-Body 둜 μ „μ†‘λœ OCTET 의 μ‹€μ œ μˆ«μžμ™€ μ •ν™•ν•˜κ²Œ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€. Range 및Content-Range 헀더λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” μΊμ‹œλŠ” 206(Partial Content) 응닡을 μΊμ‹œν•΄μ„œλŠ” μ•ˆ λœλ‹€.
Β 
Β 

ꢁ금증

λͺ©λ‘
πŸ’‘
μ›Ή μ„œλ²„μ—μ„œ μžμ›μ„ μ œκ³΅ν•œλ‹€ν•˜λŠ”λ° 그럼 μ›Ή μ„œλ²„(ν•˜λ“œμ›¨μ–΄)에 데이터가 μ €μž₯λ˜μ–΄μžˆλŠ”κ±΄κ°€?? db에 μ €μž₯ν•˜λŠ”κ²ƒμ²˜λŸΌ???
μ›Ή μ„œλ²„μ—μ„œ 정적인 데이터듀을 ν•˜λ“œμ›¨μ–΄μ— μ €μž₯ν•΄ 가지고 μžˆλ‹€κ°€ μš”μ²­ν•˜λ©΄ λ³΄λ‚΄μ£ΌλŠ” ν˜•μ‹μ΄ λ§žλŠ”κ²ƒ κ°™λ‹€. 일반적으둜 정적인 μ›Ή νŽ˜μ΄μ§€λ₯Ό λ§Œλ“ λ‹€λ©΄ ν•΄λ‹Ή μ›Ή μ„œλ²„μ— HTML 파일과 같은 μ»΄ν¬λ„ŒνŠΈ νŒŒμΌμ„ μ—…λ‘œλ“œν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•˜λ©΄ κ·Έλ•Œ μ›Ή μ„œλ²„μ—μ„œ μ œκ³΅ν•œλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€.
Β 
πŸ’‘
μ›Ήμ„œλ²„λ₯Ό 직접 κ΅¬ν˜„ν•œλ‹€λ©΄ config νŒŒμΌμ„ νŒŒμ‹±ν•΄μ„œ κ²€μ¦ν•΄μ•Όν•˜λ‚˜??
κ·Έλ ‡λ‹€. μ–΄λ””κΉŒμ§€ config λ₯Ό 유효 인자둜 λ°›μ„μ§€λŠ” 본인 νŒλ‹¨μœΌλ‘œ κ΅¬ν˜„ν•˜λ©΄ λœλ‹€.
Β 
πŸ’‘
λ©€ν‹°ν”Œλ ‰μ‹±μ˜ 단일 μŠ€λ ˆλ“œ λ°©μ‹μœΌλ‘œ μ½”λ“œκ°€ λŒμ•„κ°€λŠ”λ° μ™œ fcntl둜 non-blocking을 ν•΄μ£Όμ—ˆλŠ”μ§€??
μ‹œμŠ€ν…œ 콜둜 ν•΄λ‹Ή μ†ŒμΌ“μ„ μ‚¬μš©ν•˜λŠ” 것이기 λ•Œλ¬Έμ— 이뢀뢄을 non-blocking으둜 ν•˜κΈ° μœ„ν•΄μ„œ 이닀. μ‹œμŠ€ν…œ μ½œμ— λŒ€ν•΄μ„œ 곡뢀λ₯Ό 해보면 이해가 κ°„λ‹€.
Β 
πŸ’‘
μ›Ή λΈŒλΌμš°μ €λ‘œ μš”μ²­μ„ 보낼 정적 νŽ˜μ΄μ§€λ‚˜ μ—λŸ¬νŽ˜μ΄μ§€λ₯Ό λ”°λ‘œ html둜 λ§Œλ“€μ–΄μ•Όν•˜λŠ”κ°€?
κ·Έλ ‡λ‹€.
Β 
πŸ’‘
ν΄λΌμ΄μ–ΈνŠΈκ°€ http λ©”μ„œλ“œλ₯Ό 보낼 λ•Œ λΈŒλΌμš°μ €κ°€ μ•Œμ•„μ„œ ν•΄μ£Όλ‚˜?
μ›ΉλΈŒλΌμš°μ €κ°€ μ•Œμ•„μ„œ λ©”μ„œλ“œλ₯Ό μƒμ„±ν•΄μ„œ λ³΄λ‚΄μ£Όκ±°λ‚˜, html form ν˜•μ‹μ— 따라 λ§žμΆ°μ„œ ν•΄μ€€λ‹€.
πŸ’‘
kqueueκ°€ 이벀트λ₯Ό μ–΄λ–»κ²Œ κ°μ§€ν•˜λŠ”μ§€? 파일이 λ³€ν™”ν•˜λŠ” 거에 따라 read, write flagκ°€ λ™μž‘ν•˜λŠ”μ§€?
파일의 λ³€ν™”λ‘œ μ΄λ²€νŠΈκ°€ 트리거 될 수 μžˆλ‹€. ν•˜μ§€λ§Œ EV_SET의 인자둜 λ“€μ–΄κ°€λŠ” flags 의 μ’…λ₯˜μ— 따라 ν•΄λ‹Ή μ†ŒμΌ“μ΄ λΉ„ν™œμ„±ν™” λ˜μ–΄μžˆμ„ 수 도 μžˆλ‹€λŠ” 점을 μƒκ°ν•˜μž.
Β 
πŸ’‘
CRLF λ₯Ό μ•Œμ•„μ„œ 잘 μ½λ‚˜??
μ•Œμ•„μ„œ κ°œν–‰μœΌλ‘œ μž˜μ½μœΌλ‹ˆ ν…ŒμŠ€νŠΈ ν• λ•ŒλŠ” ν•΄λ‹Ή νŒŒμΌμ„ CRLF 둜만 λ°”κΏ”μ£Όλ©΄ λœλ‹€.(λ§₯은 기본이 LF)
Β 
πŸ’‘
multpart-form μ΄λ‚˜ chunked 와 같은 encode-64 λ°©μ‹μœΌλ‘œ λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ„ http λ°”λ””λ‘œ μž…λ ₯λ°›μ„λ•Œ 널이 λ“€μ–΄μ˜¬ 수 μžˆλ‚˜??
κ·Έλ ‡λ‹€κ³  ν•œλ‹€.
Β 
πŸ’‘
HTTP λ°”λ”” λ©”μ„Έμ§€μ˜ 끝은 μ–΄λ–»κ²Œ μ•Œ 수 μžˆμ„κΉŒ?
HTTP λ©”μ‹œμ§€μ—μ„œ λ°”λ””μ˜ 끝을 λ‚˜νƒ€λ‚΄λŠ” 방식은 '\0' 문자λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹ˆλ‹€. HTTP ν”„λ‘œν† μ½œμ€ ν…μŠ€νŠΈ 기반 ν”„λ‘œν† μ½œμ΄λ©°, HTTP λ©”μ‹œμ§€μ˜ κ΅¬μ‘°λŠ” μ‹œμž‘ 쀄(start line), 헀더(headers), 그리고 λ©”μ‹œμ§€ λ°”λ””(body)둜 κ΅¬μ„±λœλ‹€. 각 뢀뢄은 νŠΉμ • λ°©μ‹μœΌλ‘œ κ΅¬λΆ„λ˜λ©°, λ°”λ””μ˜ 끝은 '\0' 문자둜 λͺ…μ‹œμ μœΌλ‘œ ν‘œμ‹œλ˜μ§€ μ•ŠλŠ”λ‹€.
HTTP λ©”μ‹œμ§€ λ°”λ””μ˜ 끝은 λ‹€μŒ λ°©μ‹μœΌλ‘œ κ²°μ •λœλ‹€:
  1. Content-Length 헀더: 이 ν—€λ”λŠ” λ©”μ‹œμ§€ λ°”λ””μ˜ 길이λ₯Ό λ°”μ΄νŠΈ λ‹¨μœ„λ‘œ λͺ…μ‹œν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈλ‚˜ μ„œλ²„λŠ” 이 값을 μ‚¬μš©ν•˜μ—¬ λ©”μ‹œμ§€ λ°”λ””μ˜ 끝을 νŒλ‹¨ν•œλ‹€. 예λ₯Ό λ“€μ–΄, Content-Length: 1234라면, 헀더 이후에 μ˜€λŠ” 1234λ°”μ΄νŠΈκ°€ λ©”μ‹œμ§€ λ°”λ””λ‘œ ν•΄μ„λœλ‹€.
  1. Chunked Transfer Encoding: Transfer-Encoding: chunked 헀더가 μ‚¬μš©λ  λ•Œ, λ©”μ‹œμ§€ λ°”λ””λŠ” μ—¬λŸ¬ 개의 청크둜 λ‚˜λˆ„μ–΄ μ „μ†‘λœλ‹€. 각 μ²­ν¬λŠ” 길이 κ°’μœΌλ‘œ μ‹œμž‘ν•˜λ©°, λ§ˆμ§€λ§‰ μ²­ν¬λŠ” 0\r\n\r\n으둜 ν‘œμ‹œλœλ‹€. λ”°λΌμ„œ, 청크 인코딩을 μ‚¬μš©ν•  λ•ŒλŠ” λ§ˆμ§€λ§‰ 청크의 길이가 0μ΄λΌλŠ” 점을 톡해 λ°”λ””μ˜ 끝을 μ•Œ 수 μžˆλ‹€.
  1. λ©€ν‹°νŒŒνŠΈ λ°”λ””: Content-Type: multipart/form-data와 같이 λ©€ν‹°νŒŒνŠΈ λ©”μ‹œμ§€λ₯Ό μ‚¬μš©ν•  경우, 각 뢀뢄은 경계 λ¬Έμžμ—΄(boundary string)에 μ˜ν•΄ κ΅¬λΆ„λ˜λ©°, λ§ˆμ§€λ§‰ 경계 λ¬Έμžμ—΄ 뒀에 -κ°€ μΆ”κ°€λ˜μ–΄ λ©”μ‹œμ§€μ˜ 끝을 λ‚˜νƒ€λ‚Έλ‹€.
πŸ’‘
EV_SET(&tmp_event, ident, filter, flags, fflags, data, udata) μ—μ„œ data λž‘ udata μš©λ„?
EV_SET λ§€ν¬λ‘œλŠ” BSD 계열 운영 μ²΄μ œμ—μ„œ μ œκ³΅ν•˜λŠ” kqueue 이벀트 μ•Œλ¦Ό μ‹œμŠ€ν…œμ„ μ„€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. kqueueλŠ” λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ 이벀트λ₯Ό 효율적으둜 λͺ¨λ‹ˆν„°λ§ν•  수 있게 ν•΄μ£ΌλŠ” λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€. 이 μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λ©΄ 파일 λ””μŠ€ν¬λ¦½ν„°, 타이머, ν”„λ‘œμ„ΈμŠ€, μ‹ ν˜Έ λ“± λ‹€μ–‘ν•œ 이벀트 μ†ŒμŠ€μ— λŒ€ν•œ λ³€ν™”λ₯Ό λΉ„λ™κΈ°μ μœΌλ‘œ 감지할 수 μžˆμŠ΅λ‹ˆλ‹€. EV_SET 맀크둜λ₯Ό 톡해 κ°œλ³„ 이벀트λ₯Ό kevent ꡬ쑰체에 μ„€μ •ν•  수 있으며, μ΄λ•Œ μ—¬λŸ¬ νŒŒλΌλ―Έν„°λ₯Ό 지정해야 ν•©λ‹ˆλ‹€.
EV_SET의 νŒŒλΌλ―Έν„° 쀑 data와 udata에 λŒ€ν•΄ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€:
  • data: 이 νŒŒλΌλ―Έν„°μ˜ μš©λ„λŠ” 이벀트 ν•„ν„°(filter)에 따라 λ‹€λ₯΄λ©°, μ΄λ²€νŠΈμ— λŒ€ν•œ μΆ”κ°€ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, EVFILT_READ ν•„ν„°λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 dataλŠ” 읽을 수 μžˆλŠ” λ°μ΄ν„°μ˜ λ°”μ΄νŠΈ 수λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ ν•„ν„°λ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” λ‹€λ₯Έ μ’…λ₯˜μ˜ 정보λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 즉, data ν•„λ“œλŠ” μ΄λ²€νŠΈμ— 따라 λ‹€λ₯Έ 의미λ₯Ό κ°€μ§ˆ 수 있으며, 이벀트의 νŠΉμ • μ„ΈλΆ€ 사항을 λ‚˜νƒ€λ‚΄λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • udata: μ‚¬μš©μž μ •μ˜ 데이터λ₯Ό μœ„ν•œ ν¬μΈν„°μž…λ‹ˆλ‹€. 이 νŒŒλΌλ―Έν„°λŠ” kevent ꡬ쑰체와 ν•¨κ»˜ μ œκ³΅λ˜λŠ” μ΄λ²€νŠΈμ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜ μ»¨ν…μŠ€νŠΈ λ˜λŠ” 데이터λ₯Ό κ°€λ¦¬ν‚€λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. udataλŠ” 이벀트 ν•Έλ“€λŸ¬λ‚˜ 콜백 ν•¨μˆ˜μ—μ„œ ν•΄λ‹Ή 이벀트λ₯Ό 더 잘 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μΆ”κ°€ 정보λ₯Ό μ €μž₯ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, νŠΉμ • μ΄λ²€νŠΈμ™€ κ΄€λ ¨λœ 객체의 포인터λ₯Ό udata에 μ €μž₯ν•˜μ—¬ μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ μ‰½κ²Œ ν•΄λ‹Ή 객체에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
EV_SET을 μ‚¬μš©ν•˜μ—¬ kevent ꡬ쑰체λ₯Ό μ„€μ •ν•  λ•Œ, ident, filter, flags, fflags, data, udata λ“±μ˜ ν•„λ“œλ₯Ό 적절히 μ„€μ •ν•¨μœΌλ‘œμ¨, μ›ν•˜λŠ” 이벀트 λͺ¨λ‹ˆν„°λ§ λ™μž‘μ„ μ •λ°€ν•˜κ²Œ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€. data와 udataλŠ” μ΄λŸ¬ν•œ μ„€μ • μ€‘μ—μ„œλ„ 특히 이벀트 처리의 μœ μ—°μ„±κ³Ό μ»¨ν…μŠ€νŠΈ 관리 μΈ‘λ©΄μ—μ„œ μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.

μ°Έμ‘°

Loading Comments...