Werkzeug: Werkzeugκ°€ RFC2616을 μ€€μˆ˜ν•˜μ§€ μ•ŠμŒ

에 λ§Œλ“  2016λ…„ 05μ›” 26일  Β·  6μ½”λ©˜νŠΈ  Β·  좜처: pallets/werkzeug

특히 λ‚΄λΆ€μ μœΌλ‘œ WerkzeugλŠ” "Transfer-Encoding" λ˜λŠ” "X-PoweredBy" μœ ν˜•μ˜ 헀더λ₯Ό 각각 "HTTP_TRANSFER_ENCODING" 및 "X_POWERED_BY"둜 λ³€ν™˜ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 두 개의 헀더 "App-Header-1" 및 "App_Header_1"이 λͺ¨λ‘ μš”μ²­μ— μžˆλŠ” 경우(λ˜λŠ” "App_Header_1"만) λ‘˜ λ‹€ λ‚΄λΆ€μ μœΌλ‘œ λ™μΌν•œ λ°©μ‹μœΌλ‘œ μ €μž₯되며 WerkzeugλŠ” λ‘˜μ„ κ΅¬λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. . 이 λ™μž‘μ€ RFC2616 HTTP 1.1 사양을 μ€€μˆ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ 헀더 이름은 μ œμ–΄ λ˜λŠ” ꡬ뢄 λ¬Έμžκ°€ μ—†λŠ” μœ νš¨ν•œ 토큰일 수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 μš”μ²­μ΄ "App_Header_1"κ³Ό ν•¨κ»˜ λ“€μ–΄μ˜¨ λ‹€μŒ "HTTP_APP_HEADER_1"둜 λ³€ν™˜λ˜λŠ” κ²ƒμ²˜λŸΌ λ§Žμ€ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이제 Flask와 같은 ν”„λ ˆμž„μ›Œν¬λŠ” 이λ₯Ό λ™μΌν•˜μ§€ μ•Šμ€ "App-Header-1"둜 ν•΄μ„ν•˜κ³  ν•΄λ‹Ή 값을 μ „λ‹¬ν•©λ‹ˆλ‹€. μ˜¬λ°”λ₯Έ λ™μž‘μ— μ˜μ‘΄ν•˜λŠ” μ‹œμŠ€ν…œμ—μ„œλŠ” 정상적인 비ꡐ μ „λž΅μ—μ„œ "App_Header_1" != "App-Header-1"둜 μ‹€νŒ¨ν•©λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

PEP 3333을 μ°Έμ‘°ν•˜λŠ” 경우 이 λ™μž‘μ€ WSGI μ‚¬μ–‘μœΌλ‘œ 인해 λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
PEP 3333은 λ‹€μŒκ³Ό 같이 λ§ν•©λ‹ˆλ‹€.
HTTP_ λ³€μˆ˜
ν΄λΌμ΄μ–ΈνŠΈ 제곡 HTTP μš”μ²­ 헀더에 ν•΄λ‹Ήν•˜λŠ” λ³€μˆ˜(즉, 이름이 "HTTP_"둜 μ‹œμž‘ν•˜λŠ” λ³€μˆ˜). μ΄λŸ¬ν•œ λ³€μˆ˜μ˜ 쑴재 λ˜λŠ” λΆ€μž¬λŠ” μš”μ²­μ— μ μ ˆν•œ HTTP ν—€λ”μ˜ 쑴재 λ˜λŠ” λΆ€μž¬μ™€ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ‚¬μ–‘μ—λŠ” 밑쀄을 λ‹€λ₯΄κ²Œ μ²˜λ¦¬ν•˜λŠ” 것에 λŒ€ν•œ λ‚΄μš©μ΄ μ—†μŠ΅λ‹ˆλ‹€. 사싀, "App_H" λ˜λŠ” "App-H"κ°€ μžˆλŠ”μ§€ 여뢀와 같이 μ–΄λ–€ 헀더가 μžˆλŠ”μ§€ λ˜λŠ” μ—†λŠ”μ§€ μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— PEP 3333을 μ€€μˆ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  6 λŒ“κΈ€

이 λ™μž‘μ€ WSGI 사양 자체둜 인해 λ°œμƒν•˜λ©° Werkzeugκ°€ WSGI 사양을 계속 μ€€μˆ˜ν•˜λ©΄μ„œ 두 헀더λ₯Ό κ΅¬λΆ„ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. 이것이 μ‹€μ œλ‘œ λ¬Έμ œκ°€ 된 상황에 λŒ€ν•΄ μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€.

그런데 RFC 2616은 더 이상 μ‚¬μš©λ˜μ§€ μ•Šμ§€λ§Œ μ΅œμ‹  RFCλŠ” μ–΄μ¨Œλ“  이와 κ΄€λ ¨ν•˜μ—¬ 아무 것도 λ³€κ²½ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ˜ν•œ WerkzeugλŠ” ꡬ문 μˆ˜μ€€μ—μ„œ HTTP μš”μ²­ λ˜λŠ” 응닡을 ꡬ문 λΆ„μ„ν•˜κ±°λ‚˜ μž‘μ„±ν•˜λŠ” 데 μ±…μž„μ΄ μ—†μŠ΅λ‹ˆλ‹€. 이것은 μ„ νƒν•œ WSGI μ„œλ²„μ— μ˜ν•΄ μˆ˜ν–‰λ©λ‹ˆλ‹€. Werkzeugμ—λŠ” λ‚΄μž₯ μ„œλ²„κ°€ μžˆμ§€λ§Œ μ΄λŠ” ν‘œμ€€ 라이브러리의 WSGI μ„œλ²„λ§Œ ν™•μž₯ν•©λ‹ˆλ‹€.

PEP 3333을 μ°Έμ‘°ν•˜λŠ” 경우 이 λ™μž‘μ€ WSGI μ‚¬μ–‘μœΌλ‘œ 인해 λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
PEP 3333은 λ‹€μŒκ³Ό 같이 λ§ν•©λ‹ˆλ‹€.
HTTP_ λ³€μˆ˜
ν΄λΌμ΄μ–ΈνŠΈ 제곡 HTTP μš”μ²­ 헀더에 ν•΄λ‹Ήν•˜λŠ” λ³€μˆ˜(즉, 이름이 "HTTP_"둜 μ‹œμž‘ν•˜λŠ” λ³€μˆ˜). μ΄λŸ¬ν•œ λ³€μˆ˜μ˜ 쑴재 λ˜λŠ” λΆ€μž¬λŠ” μš”μ²­μ— μ μ ˆν•œ HTTP ν—€λ”μ˜ 쑴재 λ˜λŠ” λΆ€μž¬μ™€ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ‚¬μ–‘μ—λŠ” 밑쀄을 λ‹€λ₯΄κ²Œ μ²˜λ¦¬ν•˜λŠ” 것에 λŒ€ν•œ λ‚΄μš©μ΄ μ—†μŠ΅λ‹ˆλ‹€. 사싀, "App_H" λ˜λŠ” "App-H"κ°€ μžˆλŠ”μ§€ 여뢀와 같이 μ–΄λ–€ 헀더가 μžˆλŠ”μ§€ λ˜λŠ” μ—†λŠ”μ§€ μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— PEP 3333을 μ€€μˆ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

WSGIλŠ” CGI의 Python μ „μš© ν¬νŠΈμž…λ‹ˆλ‹€. PEP 0333은 "CGI ν™˜κ²½ λ³€μˆ˜"의 μ •μ˜μ— λŒ€ν•œ CGI 사양을 μ°Έμ‘°ν•˜λ©° λ‹€μŒκ³Ό 같이 λͺ…μ‹œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

The HTTP header field name is converted to upper case, has all occurrences of "-" replaced with "_" and has `HTTP_' prepended to give the meta-variable name.

https://tools.ietf.org/html/rfc3875#section -4.1.18 μ°Έμ‘°

WerkzeugλŠ” λŒ€λΆ€λΆ„ μ›μ‹œ HTTP μš”μ²­μ„ ꡬ문 λΆ„μ„ν•˜μ§€ μ•Šκ³  WSGI ν™˜κ²½μ„ μƒμ„±ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 이 λͺ¨λ“  것은 관련이 μ—†μŠ΅λ‹ˆλ‹€. WSGI ν™˜κ²½μ„ ꡬ문 λΆ„μ„ν•©λ‹ˆλ‹€. 이 νŠΉμ • κ΅¬ν˜„μ— λŒ€ν•΄ 이 문제λ₯Ό μ œκΈ°ν•˜λŠ” 이유λ₯Ό λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. λ©”μ‹ μ €λ₯Ό μ˜μ§€ λ§ˆμ„Έμš”.

기본적으둜 μ—¬κΈ°μ—λŠ” Werkzeugκ°€ κ΅¬ν˜„ν•˜λ €κ³  ν•˜λŠ” WSGI에 μ˜ν•΄ μƒμ†λœ CGI의 λ§Žμ€ μœ μ‚°μ΄ μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” μ •λ§λ‘œ 싸움을 μ‹œμž‘ν•˜λ €λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ 헀더λ₯Ό ν•„ν„°λ§ν•˜μ§€ μ•Šκ³  밑쀄이 ν¬ν•¨λœ 헀더에 λ―Όκ°ν•œ/μ• ν”Œλ¦¬μΌ€μ΄μ…˜ νŠΉμ • 정보λ₯Ό μ „λ‹¬ν•˜λŠ” "λ ˆκ±°μ‹œ" μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ²Œμ΄νŠΈμ›¨μ΄ 뒀에 μžˆλŠ” μ›Ή μ„œλ²„μ˜ 경우 특히 λ³΄μ•ˆ κ΄€λ ¨ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€(ꡬ체적인 μ˜ˆκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ μ‹€μ œλ‘œ 문제이며 초기 의견으둜 κΈ°κ°ν–ˆμŠ΅λ‹ˆλ‹€). CGIλŠ” 20년이 λ„˜μ—ˆμœΌλ―€λ‘œ WSGI 및 HTTP 사양이 μš°μ„ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ›μ‹œ ꡬ문 λΆ„μ„μ˜ 경우:
https://github.com/pallets/werkzeug/blob/03faf0569861e9d8c8c94785ad5560f735ba72da/werkzeug/serving.py#L123

(ꡬ체적인 μ˜ˆκ°€ μžˆμŠ΅λ‹ˆλ‹€. 즉, 이것은 μ‹€μ œλ‘œ μ‹€μ œ 문제이며 초기 μ˜κ²¬μ—μ„œ κΈ°κ°ν–ˆμŠ΅λ‹ˆλ‹€)

그런 λ‹€μŒ λ‚΄κ°€ 말할 μˆ˜μžˆλŠ” 것은 그런 μ„œλ²„κ°€ μžˆλ‹€λŠ” 것이 μœ κ°μž…λ‹ˆλ‹€. WerkzeugλŠ” 그것에 λŒ€ν•΄ 아무 것도 ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 당신이 보여쀀 슀 λ‹ˆνŽ«μ€ μ •ν™•νžˆ λ‚΄κ°€ "λŒ€λΆ€λΆ„"이라고 λ§ν•œ μ΄μœ μ˜€μŠ΅λ‹ˆλ‹€. Werkzeugμ—λŠ” κ°œλ°œμ— μ‚¬μš©ν•  수 μžˆλŠ” κ°„λ‹¨ν•œ ν…ŒμŠ€νŠΈ μ„œλ²„λ„ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€(예: Gunicorn + Nginx/Apacheλ₯Ό μ„€μ •ν•˜μ§€ μ•Šμ•„λ„ 됨). κ·ΈλŸ¬λ‚˜ ν•΄λ‹Ή μ„œλ²„λ₯Ό 인터넷에 λ…ΈμΆœν•˜λŠ” 경우 μ–ΈκΈ‰ν•œ 잠재적 λ¬Έμ œλŠ” (λ³΄μ•ˆ) 문제 쀑 κ°€μž₯ μž‘μŠ΅λ‹ˆλ‹€.

WSGIλŠ” μ΅œλŒ€ν•œ CGI와 ν˜Έν™˜λ˜λ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. WSGIλŠ” CGIλ₯Ό μž¬μ •μ˜ν•˜κ±°λ‚˜ λŒ€μ²΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. WSGIλŠ” _is_ CGIμž…λ‹ˆλ‹€. WSGI μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μœ νš¨ν•œ CGI μ‘μš© ν”„λ‘œκ·Έλž¨μœΌλ‘œ λ§Œλ“œλŠ” 데 κ΄€λ ¨λœ μž‘μ—…μ€ 거의 μ—†μŠ΅λ‹ˆλ‹€. os.environ Python CGI μŠ€ν¬λ¦½νŠΈλŠ” λŒ€λΆ€λΆ„ λ™λ“±ν•œ WSGI ν™˜κ²½κ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€. 이것에 λŒ€ν•΄ 무엇이든 λ³€κ²½ν•  λ•Œ κ³ λ €ν•΄μ•Ό ν•  λ§Žμ€ μœ μ‚°μ΄ μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈλ‘œμ„œμ˜ WerkzeugλŠ” 이에 λŒ€ν•΄ λ°œμ–ΈκΆŒμ΄ μ—†μœΌλ©° 특히 μ €λŠ” 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€μ‹œ λ§ν•˜μ§€λ§Œ, 이 ν”„λ‘œμ νŠΈμ˜ 이 λ¬Έμ œλŠ” λ¬΄μ˜λ―Έν•©λ‹ˆλ‹€. Werkzeug만이 μ΄λŸ¬ν•œ 행동을 ν•˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ nginxλŠ” 전체 λͺ¨ν˜Έμ„± 문제둜 인해 기본적으둜 밑쀄이 μžˆλŠ” HTTP 헀더λ₯Ό μ°¨λ‹¨ν•©λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ λ‹€λ₯Έ λ„κ΅¬λŠ” μ•„λ§ˆλ„ 그것듀을 ν•©μΉ  κ²ƒμž…λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ 도ꡬ가 λŒ€μ‹œμ™€ λ°‘μ€„μ˜ 차이λ₯Ό ꡬ뢄할 수 μ—†λ‹€λ©΄ ν‘œμ€€μ— ν•˜λ‚˜κ°€ μžˆλ‹€κ³  해도 더 이상 μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λͺ¨λ‘κ°€ ν•¨κ»˜ ν”Œλ ˆμ΄ν•΄μ•Ό ν•˜λ©°, κ²°κ΅­ 밑쀄이 μžˆλŠ” 헀더λ₯Ό λ‚΄λ³΄λ‚΄λŠ” 도ꡬ가 μ±…μž„μ΄ μžˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

KangOl picture KangOl  Β·  16μ½”λ©˜νŠΈ

caiz picture caiz  Β·  3μ½”λ©˜νŠΈ

miki725 picture miki725  Β·  10μ½”λ©˜νŠΈ

d42 picture d42  Β·  6μ½”λ©˜νŠΈ

lepture picture lepture  Β·  6μ½”λ©˜νŠΈ