Requests: ์„ธ์…˜์˜ ์Šน์ธ ํ—ค๋”๊ฐ€ ๋ฆฌ๋””๋ ‰์…˜์‹œ ์ „์†ก๋˜์ง€ ์•Š์Œ

์— ๋งŒ๋“  2015๋…„ 12์›” 28์ผ  ยท  35์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: psf/requests

developer-api.nest.com์„ ์š”์ฒญํ•˜๊ณ  ์ „๋‹ฌ์ž ํ† ํฐ์œผ๋กœ Authorization ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์š”์ฒญ์—์„œ ํ•ด๋‹น API๋Š” 307 ๋ฆฌ๋””๋ ‰์…˜์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋„ ํ›„์† ์š”์ฒญ์—์„œ Authorization ํ—ค๋”๋ฅผ ๋ณด๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์„ธ์…˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ requests.get() ์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋””๋ ‰์…˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ  307์„ ๊ฐ์ง€ ํ•œ ๋‹ค์Œ ์ง์ ‘ ์ƒˆ ์š”์ฒญ์„ ๋ฐœํ–‰ํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋ฒ„๊ทธ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์ด๋ฃจ์–ด์ง„ ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•ด Authorization ํ—ค๋”๊ฐ€ ์ „์†ก ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

In [41]: s = requests.Session()

In [42]: s.headers
Out[42]: {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'User-Agent': 'python-requests/2.7.0 CPython/3.4.3 Darwin/15.2.0'}

In [43]: s.headers['Authorization'] = "Bearer <snip>"

In [45]: s.get("https://developer-api.nest.com/devices/thermostats/")
Out[45]: <Response [401]>

In [46]: s.get("https://developer-api.nest.com/devices/thermostats/")
Out[46]: <Response [200]>

In [49]: Out[45].history
Out[49]: [<Response [307]>]

In [50]: Out[46].history
Out[50]: []

In [51]: Out[45].request.headers
Out[51]: {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'User-Agent': 'python-requests/2.7.0 CPython/3.4.3 Darwin/15.2.0'}

In [52]: Out[46].request.headers
Out[52]: {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'User-Agent': 'python-requests/2.7.0 CPython/3.4.3 Darwin/15.2.0', 'Authorization': 'Bearer <snip>'}

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‘ ๊ฐ€์ง€ Nest ๊ด€๋ จ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜๋Š” Authorization ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  access_token๊ณผ ํ•จ๊ป˜ auth ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://gist.github.com/tylerdave/409ffa08e1d47b1a1e23 ์—์„œ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉํ•  ํ—ค๋”๋กœ ์‚ฌ์ „์„ ์ €์žฅํ•˜๊ณ  ๋ฆฌ๋””๋ ‰์…˜์„ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ  ํ—ค๋”๋ฅผ ๋‹ค์‹œ ์ „๋‹ฌํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ์š”์ฒญ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    headers = {'Authorization': 'Bearer ' + access_token, 'Content-Type': 'application/json'}
    initial_response = requests.get('https://developer-api.nest.com', headers=headers, allow_redirects=False)
    if initial_response.status_code == 307:
        api_response = requests.get(initial_response.headers['Location'], headers=headers, allow_redirects=False)

๋ชจ๋“  35 ๋Œ“๊ธ€

๋ฆฌ๋””๋ ‰์…˜์€ ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ?

์•„, ๋‹ค๋ฅธ ๋„๋ฉ”์ธ. firebase-apiserver03-tah01-iad01.dapi.production.nest.com

๋„ค, ๊ทธ๊ฒƒ์€ ๋‹ค์†Œ ์˜๋„์ ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ƒˆ ํ˜ธ์ŠคํŠธ๋กœ ๋ฆฌ๋””๋ ‰์…˜ ๋  ๋•Œ ์ธ์ฆ ํ—ค๋”๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ๋งค์šฐ ๊ณต๊ฒฉ์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜คํ”„ ํ˜ธ์ŠคํŠธ ๋ฆฌ๋””๋ ‰์…˜์—์„œ ํ—ค๋”๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” CVE 2014-1829 ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ์•ˆ์ „ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํŠน์ • ๊ด€์ ์—์„œ๋Š” ์š”์ฒญ์ด ์•„๋‹Œ Session ์— Authorization ํ—ค๋”๋ฅผ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” "๋ฆฌ๋””๋ ‰์…˜์ด ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ _ ์ƒ๊ฐํ•œ๋‹ค _ ๋‚˜๋Š”์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํ˜ธํ•œ๋‹ค. ์ ์–ด๋„ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ์˜ ๊ณต๊ฒฉ์—๋„ ๊ฐœ๋ฐฉ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•œ๋‹ค. ๋น„๋ก์ด ํŠน์ • ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค์†Œ ๊นŒ๋‹ค๋กœ์›Œ ์ง€๋”๋ผ๋„ ๋ง์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋„ˆ๋ฌด ํŽธ์ง‘์ฆ ์ ์ด๋ผ๊ณ  ํ™•์‹  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋„ˆ๋ฌด ํŽธ์ง‘์ฆ ์ ์ด๋ผ๊ณ  ํ™•์‹  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ™•์‹ ์— ๋œ ๊ฐœ๋ฐฉ์ ์ด์ง€๋งŒ ๊ธฐ๊บผ์ด ๊ฒฝ์ฒญํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, rebuild_auth ์—์„œ ์ผ๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” _allowed_ ๋„๋ฉ”์ธ ์ „์ฒด์— ์ด๋Ÿฌํ•œ ํ—ค๋”๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ง€๊ธˆ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์˜ ์•ˆ์ „์„ฑ์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ "์•ˆ์ „ํ•˜์ง€ ์•Š์€"๋™์ž‘์„ ์„ ํƒํ•  ์ˆ˜์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํ—ค๋”๋ฅผ (์ด ๊ฒฝ์šฐ nest.com)์— ์œ ์ง€ํ•˜๋„๋ก ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํ—ค๋”๋ฅผ ๋ณด๋‚ผ ์ˆ˜์žˆ๋Š” ๋„๋ฉ”์ธ ๋ชฉ๋ก์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์š”์ฒญ์˜ ํ•ต์‹ฌ์ด ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ Auth ํด๋ž˜์Šค / ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ž‘์—…์— ๊ฐ€์žฅ ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์กฐ๊ฑด prepare_auth ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ™•์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์ด ์ž‘๋™ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌด์กฐ๊ฑด prepare_auth ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ‘œ์ค€ ๋ชจ๋ธ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น API๋ฅผ ์•ฝ๊ฐ„ ๋น„์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ „์†ก ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ์—ญํ• ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” TA๊ฐ€ ์—ฌ๊ธฐ์„œ ์ถ”์ฒœํ•˜๊ธฐ์— ์ ˆ๋Œ€์ ์œผ๋กœ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ์„ธ์…˜์— ์ธ์ฆ์ด ์ œ๊ณต๋˜๋ฉด ์„ธ์…˜์ด ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•ด ์ „์†ก๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” session.auth ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ธ์…˜์— ์ธ์ฆ์ด ์ œ๊ณต๋˜๋ฉด ์„ธ์…˜์ด ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•ด ์ „์†ก๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ธ์…˜์€ ๋‹จ์ผ ๋„๋ฉ”์ธ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ session.auth๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ํŠœํ”Œ ํ• ๋‹น์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฐจ๋ผ๋ฆฌ ์‚ฌ์šฉํ•  ๋„๋ฉ”์ธ์„ ์ง€์ •ํ•˜๋Š” Auth ํด๋ž˜์Šค๋ฅผ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์„ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ๋žŒ๋“ค์ด ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” requests-toolbelt์—์„œ AuthHandler ๋ฅผ ์ฑ„ํƒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์•ฝ๊ฐ„ ๋” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ธ์ฆ์— ์˜ตํŠธ ์ธํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ฆฌ๋””๋ ‰์…˜์„ ์œ„ํ•ด ํ—ค๋”๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@jtherrmann ์ด๊ฒƒ์ด ์ธ์ฆ ํ—ค๋” ์ธ ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์š”์ฒญ์— ํ•ญ์ƒ ์›ํ•˜๋Š” ํ—ค๋”๋ฅผ ๋„ฃ๋Š” ์„ธ์…˜ ์ˆ˜์ค€ ์ธ์ฆ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ง„์ „์ด๋‚˜ ์ถ”๊ฐ€ ๊ณ ๋ ค ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@ethanroy ์„ธ์…˜ ์ˆ˜์ค€ ์ธ์ฆ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ œ์•ˆ ์™ธ์— ์ถ”๊ฐ€ ๊ณ ๋ ค ์‚ฌํ•ญ์€ ์—†์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ : ์„ธ์…˜์ด ์ธ์ฆ์„ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ get ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ์ธ์ฆ์ด ๋‹ค์‹œ ์ ์šฉ๋˜๊ณ  ์บ์‹œ ๋œ ๋ฆฌ๋””๋ ‰์…˜์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‘ ๋ฒˆ ๋…ธํฌํ•˜๋ฉด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์˜๋„ ๋œ ํ–‰๋™?

>>> s = requests.Session()
>>> s.headers.update({"Authorization": "Token {}".format(API_TOKEN)})
>>> s.get(url)

<Response [403]>

>>> s.get(url)

<Response [200]>

@GregBakker ๋„ค, ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์˜๋„ ๋œ ํ–‰๋™์˜ ํ•ฉ๋ฅ˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ๋ฒ„๊ทธ๋Š” ์›๋ž˜ 403์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผ ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

@Lukasa ๊ฐ€ "๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์„ธ์…˜ ์ˆ˜์ค€ ์ธ์ฆ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ๋งํ•  ๋•Œ, ์ด๊ฒƒ์ด ์˜ค๋Š˜๋‚  ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์ฝ”๋“œ์—์„œ๋ณด๊ณ ์žˆ๋Š” ๊ฒƒ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋Œ€๋‹ต์€ '์•„๋‹ˆ์˜ค'์ด์ง€๋งŒ ๋‹น์‹ ์˜ ๋ง์€ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์„ธ์…˜ ์ธ์ฆ ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ž˜, ์ž‘๋™ํ•ด์•ผ ๋ผ.

@jwineinger ๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์—ฌ์ „ํžˆ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ Nest ๊ด€๋ จ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜๋Š” Authorization ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  access_token๊ณผ ํ•จ๊ป˜ auth ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://gist.github.com/tylerdave/409ffa08e1d47b1a1e23 ์—์„œ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉํ•  ํ—ค๋”๋กœ ์‚ฌ์ „์„ ์ €์žฅํ•˜๊ณ  ๋ฆฌ๋””๋ ‰์…˜์„ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ  ํ—ค๋”๋ฅผ ๋‹ค์‹œ ์ „๋‹ฌํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ์š”์ฒญ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    headers = {'Authorization': 'Bearer ' + access_token, 'Content-Type': 'application/json'}
    initial_response = requests.get('https://developer-api.nest.com', headers=headers, allow_redirects=False)
    if initial_response.status_code == 307:
        api_response = requests.get(initial_response.headers['Location'], headers=headers, allow_redirects=False)

์ด ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • requests.Session ๊ตฌํ˜„์—์„œ rebuild_auth ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ • ์˜ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

from requests import Session

class CustomSession(Session):
    def rebuild_auth(self, prepared_request, response):
        return

s = CustomSession()
s.get(url, auth=("username", "password"))

@ sigmavirus24 @ gabriel-loo์˜ ์†”๋ฃจ์…˜์— ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ณด์•ˆ ๋ฌธ์ œ?

@ j08lue ์˜ˆ. ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค. ์ƒˆ ๋„๋ฉ”์ธ์œผ๋กœ ์ž„์˜ ๋ฆฌ๋””๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ธ์ฆ์„ ์ œ๊ฑฐ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ CVE๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์‹ญ์‹œ์˜ค.

๋‚˜๋Š” api.github.com ์š”์ฒญ์„ํ•˜๊ณ  ์žˆ๊ณ  ๊ณต๊ฒฉ์ž๊ฐ€ ์ž์‹ ์ด ์ œ์–ดํ•˜๋Š” another-domain.com ๋กœ์˜ ๋ฆฌ๋””๋ ‰์…˜์„ ๋”ฐ๋ฅด๋„๋ก ๊ด€๋ฆฌํ•˜๊ณ  ๋‚ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ (์š”์ฒญ ํฌํ•จ)์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด์žˆ๋Š” ํ† ํฐ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ทธ๋“ค์ด API๋ฅผ ํ†ตํ•ด ์ปค๋ฐ‹์„ ํ•  ๋•Œ ์š”์ฒญ์— ์ปค๋ฐ‹์„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ƒํƒœ๋ฅผ ์•ฝํ™”์‹œํ‚ค๊ณ  ์ ๊ทน์ ์œผ๋กœ ํ•ด๋ฅผ ๋ผ์น  ์ˆ˜์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์š”์ฒญ์— ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ๋ฆฌ๋””๋ ‰์…˜์—์„œ ๋ฌด์กฐ๊ฑด ์ธ์ฆ ์ž๊ฒฉ ์ฆ๋ช…์„ ๋ณด๋‚ผ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๋ฆฌ๋””๋ ‰์…˜์ด ์•…์„ฑ์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ๋‹ค๋ฅธ ํšŒ์‚ฌ ๋‚˜ ์„œ๋น„์Šค์— ์œ ์ถœํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•ฉ๋‹ˆ๊นŒ? ์›๋ž˜ ์„œ๋น„์Šค๋Š” ๊ท€ํ•˜, ๊ท€ํ•˜์˜ ๊ณ ๊ฐ ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•œ ๊ธฐ๋ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋””๋ ‰์…˜ ๋œ ์ƒˆ ๋„๋ฉ”์ธ์ด ์‚ฌ์šฉ์ž์˜ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ์ž ์žฌ์ ์œผ๋กœ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐ์ดํ„ฐ๋กœ ๊ธฐ๋กํ•˜๋Š” ๊ฒฝ์šฐ์—๋„์ด๋ฅผ ๊ณต๊ฒฉํ•˜๊ณ  ํ•ด๋‹น ๋กœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ ํ•  ์ˆ˜์žˆ๋Š” ์‚ฌ๋žŒ์€ ์›๋ž˜ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์†ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ๊ทธ ์œ„ํ—˜์„ ๊ฐ์ˆ˜ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@ sigmavirus24 ์ผ๋Ÿฌ์ŠคํŠธ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ๊ถ๊ทน์ ์œผ๋กœ ๋ฏผ๊ฐํ•œ ํ—ค๋”๋ฅผ ๋ฆฌ๋””๋ ‰์…˜์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•œ๋‹ค๋ฉด์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ์ „ํžˆ ์—ด๋ ค์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‹น์‹ ์ด ์–ป๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ ์ ˆํ•œ ์˜ค๋ฅ˜๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค (403), ์—ฌ๊ธฐ์„œ ์กฐ์น˜๋ฅผ ์ทจํ•  ํ•„์š”๊ฐ€์—†๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ฌด์—‡ ์„ ์—ผ๋‘ ์— ๋‘ ์…จ๋‚˜์š”, @Lukasa?

์ตœ๊ทผ์— ๋น„๊ณต๊ฐœ API๋กœ ์ž‘์—… ํ•  ๋•Œ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋ฌธ์ œ๋Š” ๋ฆฌ๋””๋ ‰์…˜์—์„œ ์ธ์ฆ์„ ์ œ๊ฑฐํ•˜๋Š” ์ด์œ ๋กœ ์™„์ „ํžˆ ์ดํ•ด๋ฉ๋‹ˆ๋‹ค. @ gabriel-loo์™€ ๊ฐ™์€ ์†”๋ฃจ์…˜์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜์žˆ์„๋งŒํผ ์•ˆ์ „ํ•œ ํ™˜๊ฒฝ์— ์žˆ๋‹ค๊ณ  ๋ฏฟ๋Š”๋‹ค๋ฉด ๊ณ ๋ คํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ์„ธ์…˜ ๋ ˆ๋ฒจ ํ•ธ๋“ค๋Ÿฌ. ๋˜๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์œ„์—์„œ ์ œ์•ˆํ•œ๋Œ€๋กœ ๋ฆฌ๋””๋ ‰์…˜์„ ์™„์ „ํžˆ ๊ฑด๋„ˆ ๋›ฐ์–ด ํ•ด๊ฒฐํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ์‹ญ์‹œ์˜ค. ๋”ฐ๋ผ์„œ๋ณด๊ธฐ์— ๋”ฐ๋ผ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” Python์ด ์•„๋‹Œ ๋‹ค๋ฅธ HTTP ํด๋ผ์ด์–ธํŠธ _did_๊ฐ€ ์ธ์ฆ ํ—ค๋”๋ฅผ ํ†ต๊ณผํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ์ด์œ ๋ฅผ ํ˜ผ๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ œ์•ˆ : ์—ฌ๊ธฐ์—์„œ warnings ๋ฅผ ํ†ตํ•ด ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•˜์—ฌ ํ—ค๋”๊ฐ€ ์žˆ๊ณ  ์ œ๊ฑฐ ๋  ๋•Œ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ํ˜ธ์ถœ์ž๊ฐ€ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋“œ๋ฌธ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@tlantz ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฝค ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ (๊ทธ ์ข…์†์„ฑ ์ค‘ ํ•˜๋‚˜ ์ธ urllib3๋ฟ๋งŒ ์•„๋‹ˆ๋ผ)๋กœ์„œ์˜ ์š”์ฒญ์€ ๊ฒฝ๊ณ  ๋ชจ๋“ˆ์„ ํ†ตํ•ด ๋˜๋Š” ๋กœ๊น…์„ ํ†ตํ•ด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ ํ•  ๋•Œ ์ƒ๋‹นํ•œ ๋ถ„๋…ธ๋ฅผ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฒฝ๊ณ  ๋ชจ๋“ˆ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ตœ์‹  ๋ฒ„์ „์˜ OpenSSL์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ ๋œ Python ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋“ฑ ์‚ฌ๋žŒ๋“ค์ด ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผํ•˜๋Š” ์‚ฌํ•ญ์„์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์ด ๋™์ž‘์€ TLS ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์ธ์ฆ์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ง„์ •์„ฑ ์žˆ๊ณ  ์ •๋‹นํ•œ ๋ถˆ๋งŒ์„ ํ‘œ๋ช… ํ•œ ์‚ฌ์šฉ์ž ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ๋ถ„๋ช…ํžˆ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์—ผ๋‘์—๋‘๊ณ  DEBUG ์ˆ˜์ค€์—์„œ ์ด๊ฒƒ์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์ง€ ์•Š์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๋กœ๊น… (์ผ๋ฐ˜์ ์œผ๋กœ ๊ดœ์ฐฎ์€ ๊ด€ํ–‰)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ํ•ด๋‹น ์ˆ˜์ค€์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ•™์Šต๊ณผ, ๊ทธ ์ž์ฒด๊ฐ€ ๊ธฐ๋ก ๋ฐฉ๋ฒ• ์ž‘์€ ์š”์ฒญ ์ฃผ์–ด, ์ด๊ฒƒ์€ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ๋กœ ์ƒ๋‹นํžˆ ๋ˆˆ์— ๋„๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณต์ •ํ•œ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๊นŒ?

๋„ค, ์™„์ „ํžˆ ๊ณต์ •ํ•œ ๊ฑฐ๋ž˜ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. warnings ๋Œ€ํ•œ ์ถ”๋ก ์ด ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 30 ๋ถ„ ๋™์•ˆ ๋˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜์•„ํ•ด ๋‹น์‹ ์ดํ–ˆ๋˜ ์‹œ๊ฐ„์œผ๋กœ ์ƒ๊ฐ logging ์–ด์จŒ๋“ ์—์„œ ์ž์‹ ์˜ ๋ฌผ๊ฑด์„ ์ฃผ๋ณ€์— DEBUG ๋‚˜๋Š” ์ƒ๊ฐํ•œ๋‹ค, ๊ทธ๋ž˜์„œ DEBUG ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ๋žŒ๋“ค์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ์• ์“ฐ๋Š” ๊ฒฝ์šฐ์˜ 95 %๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์„ธ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ Authorization ํ—ค๋”๋ฅผ ๋ณด์œ ํ•˜์ง€๋งŒ ๋ฆฌ๋””๋ ‰์…˜์œผ๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์š”์ฒญ (2.18.4)

๋™๋ฃŒ์™€ ์ €๋Š”์ด ๋™์ž‘๊ณผ ์ง์ ‘ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ์ตœ์†Œํ•œ ๋ช‡ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” API ํ˜ธ์ถœ์„ api.my-example-site.org ์—์„œ www.api.my-example-site.org ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฆฌ๋””๋ ‰์…˜์—์„œ ํ—ค๋”๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์˜๋„ ๋œ ๋™์ž‘์ด๋ผ๋ฉด (๋˜๋Š” ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ) ์ ์–ด๋„ ๋ฌธ์„œ์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„ ๋‚ด๊ธฐ ์œ„ํ•ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ๋‹ค์‹œ ์ฝ์—ˆ๊ณ , Request ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ์—์„œ์ด ๋™์ž‘์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋ณด์•˜๋‹ค๋ฉด ๋ช‡ ๋ถ„ ์•ˆ์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฐพ์€ ํ›„ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ๋ฌธ์„œ์˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์„ ์ฝ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ndmeiri ๋‹˜ , ์‚ฌ์šฉ์ž ์ง€์ • ํ—ค๋” ์ œ๋ชฉ ์•„๋ž˜์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ๋น ๋ฅธ ์‹œ์ž‘ ๊ฐ€์ด๋“œ์— ์ด์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ๋„ฃ์„ ๋” ์ข‹์€ ์žฅ์†Œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด, ์šฐ๋ฆฌ๋Š” ๊ท€ํ•˜์˜ ์ œ์•ˆ์„ ๊ฒ€ํ† ํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ด ํ‹ฐ์ผ“๊ณผ ์ง์ ‘ ๊ด€๋ จ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ๋ฌธ์ œ ๋˜๋Š” PR๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

์•ˆ๋…•ํ•˜์„ธ์š” @nateprewitt , ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋” ์„น์…˜์„ ์ง€์  ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋ถ„๋ช…ํžˆ ๋‚˜๋Š” โ€‹โ€‹๋ฌธ์„œ์˜ ๊ทธ ๋ถ€๋ถ„์„ ํ™•์ธํ•  ์ƒ๊ฐ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆ ์„น์…˜์— ์ฝœ ์•„์›ƒ ๋˜๋Š” ์ฝœ ์•„์›ƒ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ˜„์žฌ ์ƒ๋‹นํžˆ ๋ฐ”์˜์ง€๋งŒ ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ƒํ™ฉ์ด ์ง„์ •๋˜๋ฉด PR์„ ์—ฌ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์˜๋„ ๋œ ๋™์ž‘ ์ธ ๊ฒฝ์šฐ

@ndmeiri ์˜ˆ, ๋ฏผ๊ฐํ•œ ์ธ์ฆ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ž ์žฌ์ ์œผ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜์—†๋Š” ์†Œ์Šค๋กœ ์œ ์ถœํ•˜์ง€ ์•Š๋„๋ก ์˜๋„ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋ช…ํ™•ํ•˜๊ฒŒ)

# 4983์˜ "์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ๋„๋ฉ”์ธ"์ด ๋” ์ด์ƒ sessions.py ๊ตฌํ˜„์—์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ _know_ ํŠน์ • ๋‹ค๋ฅด์ง€๋งŒ ์•ˆ์ „ํ•œ URL๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” URL์„ ์š”์ฒญํ•˜๊ณ  Authorization ํ—ค๋”์˜ ์ง€์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋””๋ ‰์…˜์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋Š” ์ƒํ™ฉ์—์„œ ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์ œ๋ฐœ ์–ด๋–ป๊ฒŒ ์ด๋ฃฐ๊นŒ์š”?

rebuild_auth ๋ฉ”์„œ๋“œ๋ฅผ ํŒจ์น˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค : https://github.com/DHI-GRAS/earthdata-download/blob/master/earthdata_download/download.py#L27 -L49

@ j08lue ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ท€ํ•˜์˜ ์˜๊ฒฌ์ด ์ „๋‹ฌ๋˜๊ธฐ ์ „์— allow_redirects ์„ False ๋กœ ์„ค์ •ํ•˜๊ณ  ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์˜ˆ์ƒ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํŠน์ • ๋ฆฌ๋””๋ ‰์…˜์„ ๋ช…์‹œ ์ ์œผ๋กœ ๋”ฐ๋ฅด๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ €์—๊ฒŒ ๋‹จ๊ธฐ์ ์ธ ์ƒํ™ฉ์ด๋ฏ€๋กœ ์ด๊ฒƒ์ด ์ ์ ˆํ•œ ์ž„์‹œ ํ•ด๊ฒฐ์ฑ…์ด๊ธฐ๋ฅผ ๋ฐ”๋ผ์ง€ ๋งŒ, ํ•„์š”ํ•˜๋‹ค๋ฉด ์žฅ๊ธฐ์ ์œผ๋กœ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰