Aiohttp: ν΄λΌμ΄μ–ΈνŠΈ μ‘λ‹΅μ—μ„œ max_field_size에 μ‰½κ²Œ μ•‘μ„ΈμŠ€ν•  수 μ—†μŒ

에 λ§Œλ“  2017λ…„ 10μ›” 07일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: aio-libs/aiohttp

κΈ΄ 이야기 짧은

http ν΄λΌμ΄μ–ΈνŠΈλŠ” νŒŒμ„œ λ§€κ°œλ³€μˆ˜κ°€ μžˆλ”λΌλ„ κΈ°λ³Έ 헀더 κ°’ 길이 8190 을 μž¬μ •μ˜ν•˜λŠ” 것을 μ‹€μ œλ‘œ μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ·Έ κ²°κ³Ό λ‹€μŒκ³Ό 같은 였λ₯˜ λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

aiohttp.client_exceptions.ClientResponseError: 400, message='Got more than 8190 bytes when reading Header value is too long.'

μ‹€μ œ μ•±μ˜ μŠ€νƒ 좔적:

<snip>
File "/usr/local/lib/python3.6/site-packages/pyportify/google.py", line 113, in _http_get
params=merged_params,
File "/usr/local/lib/python3.6/site-packages/aiohttp/helpers.py", line 97, in iter
ret = yield from self._coro
File "/usr/local/lib/python3.6/site-packages/aiohttp/client.py", line 241, in _request
yield from resp.start(conn, read_until_eof)
File "/usr/local/lib/python3.6/site-packages/aiohttp/client_reqrep.py", line 564, in start
message=exc.message, headers=exc.headers) from exc
aiohttp.client_exceptions.ClientResponseError: 400, message='Got more than 8190 bytes when reading Header value is too long.'

μ˜ˆμƒλ˜λŠ” 행동

session/get μš”μ²­μ—μ„œ νŒŒμ„œλ₯Ό μ„€μ •ν•˜κ±°λ‚˜ max_field_sizeλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹€μ œ 행동

λ‚˜λ„ λͺ»ν•΄

μž¬ν˜„ 단계

λ‚˜λŠ” 이것이 그것을 ν•  것이라고 λ―ΏμŠ΅λ‹ˆλ‹€ :

import aiohttp
import asyncio

@asyncio.coroutine
def main():
        with aiohttp.ClientSession() as session:
                resp = yield from session.get('http://test.xr6.me')
                print(len(resp.headers['X-TEST-HEADER']))
                resp.close()

if __name__ == "__main__":
        loop = asyncio.get_event_loop()
        loop.run_until_complete(
            asyncio.gather(main())
        )
        loop.close()

λ‹Ήμ‹ μ˜ ν™˜κ²½

Ubuntu jessie(Windows용 bash, λ‹€λ₯Έ κ²ƒμ—μ„œλ„ μž¬ν˜„)
python3.4(λ‹€λ₯Έ κ²ƒλ“€μ—μ„œλ„ μž¬μƒμ‚°)

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

였늘 저녁에 마이크둜 μ„œλΉ„μŠ€ 쀑 ν•˜λ‚˜λ‘œ MS Teams 봇 ν”„λ ˆμž„μ›Œν¬(aiohttp)λ₯Ό λ°°ν¬ν–ˆμŠ΅λ‹ˆλ‹€.
OpenID/Oauth2λ₯Ό μ‚¬μš©ν•˜λ©΄ x-userinfo ν—€λ”μ˜ μ‚¬μš©μž 속성이 8Kb μ œν•œμ„ κΉ¨λœ¨λ¦½λ‹ˆλ‹€.

μš°λ¦¬λŠ” μ΄λŸ¬ν•œ μ„œλͺ…λœ 헀더에 μƒλ‹Ήνžˆ μ˜μ‘΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν—€λ”λŠ” λ³€μ‘°λ˜μ§€ μ•Šμ€ νŽ˜μ΄λ‘œλ“œλ₯Ό μ‹ λ’°ν•˜κ³  μ‚¬μš©μž, λ²”μœ„ 및 속성을 μ‹λ³„ν•˜λŠ” 단일 정보 μ†ŒμŠ€μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

이 λ³€κ²½ 사항에 λŒ€ν•œ 지원이 μžˆλ‹€λ©΄ 우리 직원 쀑 ν•œ λͺ…이 PR에 도전할 수 μžˆμŠ΅λ‹ˆκΉŒ?

우리의 κ²½ν—˜μ— λ”°λ₯΄λ©΄ μ΄λŸ¬ν•œ 값은 ꡬ성 κ°€λŠ₯ν•œ κ²½ν–₯이 μžˆλ‹€κ³  말할 수 μžˆμŠ΅λ‹ˆλ‹€.
Bowsers : Chrome/ium은 250KB의 헀더λ₯Ό μ§€μ›ν•˜λ©° 기타 μ£Όλ₯˜λŠ” λ™μΌν•˜κ±°λ‚˜ κ·Έ μ΄μƒμž…λ‹ˆλ‹€.
ꡬ성 μ˜΅μ…˜μ„ 톡해 이 μ œν•œμ—μ„œ HTTP 데λͺ¬ 이 μœ μ—°ν•©λ‹ˆλ‹€.

  • nginx - client_header_buffer_size 64k;
  • npm - "μ‹œμž‘": "λ°˜μ‘ 슀크립트 --max-http-header-size=60000 μ‹œμž‘"
  • gunicorn - limit_request_field_size: 65536
  • IIS: μ΅œλŒ€ ν•„λ“œ 길이
  • μ•„νŒŒμΉ˜: LimitRequestFieldsize 65536

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

λΆˆν–‰νžˆλ„ ν˜„μž¬ ν΄λΌμ΄μ–ΈνŠΈ λ””μžμΈμ—λŠ” μš”μ²­λœ λ§€κ°œλ³€μˆ˜λ₯Ό μœ„ν•œ μžλ¦¬κ°€ μ—†μŠ΅λ‹ˆλ‹€.
#2019κ°€ λλ‚˜λ©΄ 문제둜 λŒμ•„κ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

우리의 λͺ©ν‘œλŠ” λΈŒλΌμš°μ €λ³΄λ‹€ κ΄€λŒ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ? λΈŒλΌμš°μ €κ°€ μ΄λŸ¬ν•œ κΈ΄ 쀄을 λ²„λ¦¬λŠ”μ§€ μ—¬λΆ€λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ ν™•μ‹€νžˆ 였λ₯˜κ°€ λ°œμƒν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. 이 경우 8190은 λΆ„λͺ…νžˆ λ„ˆλ¬΄ μž‘μŠ΅λ‹ˆλ‹€. 이 μ œν•œμ„ μ„€μ • κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€μ§€ μ•ŠμœΌλ €λ©΄ 많이 λ†’μ΄λŠ” 것이 쒋은 ν•΄κ²°μ±…μž…λ‹ˆλ‹€.

IFAIK λΈŒλΌμš°μ €λŠ” λΈŒλΌμš°μ €κ°€ κΈ°λŒ€ν•˜λŠ” 것보닀 더 κΈ΄ 것을 쑰용히 λ²„λ¦½λ‹ˆλ‹€.
μΉ¨λ¬΅ν•˜λŠ” λ¬΄μ§€λŠ” 라이브러리 IMHO에 λŒ€ν•œ μ˜΅μ…˜μ΄ μ•„λ‹ˆμ§€λ§Œ ꡬ성 κ°€λŠ₯ν•œ 것이어야 ν•©λ‹ˆλ‹€.

였늘 저녁에 마이크둜 μ„œλΉ„μŠ€ 쀑 ν•˜λ‚˜λ‘œ MS Teams 봇 ν”„λ ˆμž„μ›Œν¬(aiohttp)λ₯Ό λ°°ν¬ν–ˆμŠ΅λ‹ˆλ‹€.
OpenID/Oauth2λ₯Ό μ‚¬μš©ν•˜λ©΄ x-userinfo ν—€λ”μ˜ μ‚¬μš©μž 속성이 8Kb μ œν•œμ„ κΉ¨λœ¨λ¦½λ‹ˆλ‹€.

μš°λ¦¬λŠ” μ΄λŸ¬ν•œ μ„œλͺ…λœ 헀더에 μƒλ‹Ήνžˆ μ˜μ‘΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν—€λ”λŠ” λ³€μ‘°λ˜μ§€ μ•Šμ€ νŽ˜μ΄λ‘œλ“œλ₯Ό μ‹ λ’°ν•˜κ³  μ‚¬μš©μž, λ²”μœ„ 및 속성을 μ‹λ³„ν•˜λŠ” 단일 정보 μ†ŒμŠ€μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

이 λ³€κ²½ 사항에 λŒ€ν•œ 지원이 μžˆλ‹€λ©΄ 우리 직원 쀑 ν•œ λͺ…이 PR에 도전할 수 μžˆμŠ΅λ‹ˆκΉŒ?

우리의 κ²½ν—˜μ— λ”°λ₯΄λ©΄ μ΄λŸ¬ν•œ 값은 ꡬ성 κ°€λŠ₯ν•œ κ²½ν–₯이 μžˆλ‹€κ³  말할 수 μžˆμŠ΅λ‹ˆλ‹€.
Bowsers : Chrome/ium은 250KB의 헀더λ₯Ό μ§€μ›ν•˜λ©° 기타 μ£Όλ₯˜λŠ” λ™μΌν•˜κ±°λ‚˜ κ·Έ μ΄μƒμž…λ‹ˆλ‹€.
ꡬ성 μ˜΅μ…˜μ„ 톡해 이 μ œν•œμ—μ„œ HTTP 데λͺ¬ 이 μœ μ—°ν•©λ‹ˆλ‹€.

  • nginx - client_header_buffer_size 64k;
  • npm - "μ‹œμž‘": "λ°˜μ‘ 슀크립트 --max-http-header-size=60000 μ‹œμž‘"
  • gunicorn - limit_request_field_size: 65536
  • IIS: μ΅œλŒ€ ν•„λ“œ 길이
  • μ•„νŒŒμΉ˜: LimitRequestFieldsize 65536

λ‚˜λŠ” κ³„μ†ν•΄μ„œ PR을 ν•  κ²ƒμž…λ‹ˆλ‹€. 전에 λΉ„μŠ·ν•œ 것듀이 λ°›μ•„λ“€μ—¬μ§€λŠ” 것을 λ³Έ 적이 μžˆμŠ΅λ‹ˆλ‹€.

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