Axios: HTTP ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•œ HTTPS ์š”์ฒญ ์‹คํŒจ

์— ๋งŒ๋“  2017๋…„ 05์›” 30์ผ  ยท  52์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: axios/axios

์š”์•ฝ

HTTP ํ”„๋ก์‹œ๋กœ HTTPS ์š”์ฒญ์„ ์‹œ๋„ํ•˜๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

const req = await axios({
  url: 'https://somedomain.com',
  proxy: {
    host: '89.151.146.7',
    port: 6060,
    auth: {
      username: 'myname',
      password: 'mypass',
    },
  },
});

๊ฒฐ๊ณผ:

Error: write EPROTO 140736379442112:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:794

๋ฌธ์ œ๋Š” ์ด ํ‹ฐ์ผ“์˜ @chovy ์— ์˜ํ•ด ์ด๋ฏธ ์„ค๋ช…๋˜์—ˆ์œผ๋ฉฐ OP์— ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: https://github.com/mzabriskie/axios/issues/662

@chovy ๋Š” ๋‹ค์Œ๊ณผ

๋‚˜๋Š” ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๊ฐ€ http ํ”„๋ก์‹œ๋กœ https URL์„ ์น  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์š”์ฒญ์—์„œ ์ž˜ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋˜ํ•œ ์‰˜์—์„œ ์ปฌ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. axios์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. EPROTO ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ๋งฅ

  • ์•ก์‹œ์˜ค์Šค ๋ฒ„์ „: v0.16.1
  • ํ™˜๊ฒฝ: ๋…ธ๋“œ v7.10.0, Mac OSX Sierra

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

์ตœ๊ทผ์— ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋‚ด ์†”๋ฃจ์…˜์€ HTTPS-over-HTTP ํ„ฐ๋„์„ ์‚ฌ์šฉํ•˜๊ณ  URL์— ๋ช…์‹œ์ ์œผ๋กœ ํฌํŠธ 443์„ ์ง€์ •ํ•˜๊ณ  axios์—์„œ ์ž๋™ ํ”„๋ก์‹œ ๊ฐ์ง€๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

import axios, { AxiosInstance } from 'axios';
import * as tunnel from 'tunnel';

const tunnel = tunnel.httpsOverHttp({
    proxy: {
        host: 'proxy.mycorp.com',
        port: 8000,
    },
});

const httpClient: AxiosInstance = axios.create({
    baseURL: 'https://some.api.com:443',
    httpsAgent: tunnel,
    proxy: false,
});

์ด ๋ฌธ์„œ ์˜ ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์‹ญ์‹œ์˜ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค,
1์›”

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

ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•œ https ์š”์ฒญ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. request.js๋กœ ์ด๋™ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

return axios({ url: 'https://site.com', proxy: { host: 'proxy.xxxxxx.com', port: 3128 } })
๊ฒฐ๊ณผ:
Error: write EPROTO 139800246822688:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:794

์ด ์ƒํ™ฉ์—์„œ request.js์™€ curl์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ๋งฅ

  • ์•ก์‹œ์˜ค์Šค ๋ฒ„์ „: v0.16.1
  • ํ™˜๊ฒฝ: ๋…ธ๋“œ v6.9.5, CentOS ๋ฆด๋ฆฌ์Šค 6.8(์ตœ์ข…)

๋‚˜์™€ ๋‚ด ๋™๋ฃŒ๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. PR์ด ๊ณง ์ œ๊ณต๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ™๋ณด๋Š” ์—ฌ๊ธฐ https://github.com/mzabriskie/axios/pull/959

๋™์ผํ•œ ๋ฌธ์ œ: http ํ”„๋ก์‹œ ๋’ค์—์„œ https ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

axios.get('https://resources.json', {   
   proxy: {
      host: 'http://my.proxy.com',
      port: 12345
   }
})
   .then(() => {})
   .catch(() => {});

๊ฒฐ๊ณผ:
Error: getaddrinfo ENOTFOUND http://my.proxy.com http://my.proxy.com:12345

ํ˜„์žฌ๊นŒ์ง€ ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ๋ฌธ์ œ๋Š” ํ”„๋ก์‹œ์™€ ๊ด€๋ จ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฆ๋˜์ง€ ์•Š์€ https ๋„๋ฉ”์ธ์— GET ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. Linux ํ„ฐ๋ฏธ๋„ ๋‚ด๋ถ€์˜ curl ์—์„œ ํ•ด๊ฒฐ์ฑ…์€ -k ๋˜๋Š” --insecure ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. Axios ์†”๋ฃจ์…˜์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์ง€๋งŒ request lib๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์—๊ฒŒ ์•„์ด๋””์–ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

const agentOptions = {
    host: '10.100.0.10',
    port: '443',
    path: '/',
    rejectUnauthorized: false,
  }

const agent = new https.Agent(agentOptions)
request({
      url: 'https://10.100.0.10/myUncertifiedTargetUrl',
      method: 'GET',
      agent,
    }, (err, resp, body) => {
...

#959๊ฐ€ ๋ณ‘ํ•ฉ๋  ๋•Œ๊นŒ์ง€ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ ํ•˜์„ธ์š” .

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค . btw

@mistermo ๋‚˜๋Š” ์„ฑ๊ณตํ•˜์ง€ ์•Š๊ณ  ๋ฐฉ๊ธˆ ์ผ์„ ๋– ๋‚ฌ์Šต๋‹ˆ๋‹ค :(

๋‚˜๋Š”์ด ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค : https://github.com/Yoctol/messaging-apis/tree/master/packages/messaging-api-messenger

๊ทธ๋ฆฌ๊ณ  "axios"๋ฅผ ๊ท€ํ•˜์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
"์˜ค๋ฅ˜: EPROTO 139800246822688 ์“ฐ๊ธฐ: ์˜ค๋ฅ˜:140770FC :SSL ๋ฃจํ‹ด:SSL23_GET_SERVER_HELLO :์•Œ ์ˆ˜ ์—†๋Š” ํ”„๋กœํ† ์ฝœ:../deps/openssl/openssl/ssl/s23_clnt.c :794"

ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
"์˜ค๋ฅ˜: getaddrinfo EAI_AGAIN"

Messenger ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
`
ํด๋ผ์ด์–ธํŠธ = axios.create({ ... });

client.get('...')
`

Axios "์š”์ฒญ" ๊ธฐ๋Šฅ์œผ๋กœ ์ง์ ‘ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜์…จ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”!

ํŽธ์ง‘: ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒƒ:
https://github.com/axios/axios/pull/959#issuecomment -337595602

์ด๊ฒƒ์„ ํ•ฉ์น  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ config.transport๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ups, ์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

๋ถˆํ–‰ํžˆ๋„ ์ด pull ์š”์ฒญ์€ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/Sitronik/axios

์ตœ๊ทผ์— ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋‚ด ์†”๋ฃจ์…˜์€ HTTPS-over-HTTP ํ„ฐ๋„์„ ์‚ฌ์šฉํ•˜๊ณ  URL์— ๋ช…์‹œ์ ์œผ๋กœ ํฌํŠธ 443์„ ์ง€์ •ํ•˜๊ณ  axios์—์„œ ์ž๋™ ํ”„๋ก์‹œ ๊ฐ์ง€๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

import axios, { AxiosInstance } from 'axios';
import * as tunnel from 'tunnel';

const tunnel = tunnel.httpsOverHttp({
    proxy: {
        host: 'proxy.mycorp.com',
        port: 8000,
    },
});

const httpClient: AxiosInstance = axios.create({
    baseURL: 'https://some.api.com:443',
    httpsAgent: tunnel,
    proxy: false,
});

์ด ๋ฌธ์„œ ์˜ ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์‹ญ์‹œ์˜ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค,
1์›”

@jan-molak ๋‚ด ์ˆ˜์ •์€ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

  1. npm ์„ค์น˜ axios-https-proxy-fix
  2. ๊ทธ ๋‹ค์Œ์—
import axios from 'axios-https-proxy-fix'; 

const proxy = {
  host: 'some_ip',
  port: some_port_number,
  auth: {
    username: 'some_login',
    password: 'some_pass'
  }
};

async someMethod() {
  const result = await axios.get('some_https_link', {proxy});
}

@jan-molak์˜ ์†”๋ฃจ์…˜๋„ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. URL์— ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jan-molak @Sitronik ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค: ์†Œ์ผ“ ๋Š๊ธฐ.
๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ์š”์ฒญ์ด charles๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด๋Š” ๊ฒƒ์ด๋ฏ€๋กœ charles๋ฅผ ์—ด๊ณ  ๋‚ด ์ฝ”๋“œ์—์„œ ํ”„๋ก์‹œ๋ฅผ {host:'127.0.0.1', port:8888 }๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

0.19.0์— ํฌํ•จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@astappev ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฒ€ํ† ํ•ด์•ผ ํ•  ๊ด€๋ จ ๋ฌธ์ œ์™€ PR์ด ๋งŽ์ด ์žˆ์ง€๋งŒ 0.19.0 ๋กœ๋“œ๋งต์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@emilyemorehouse , ์–ธ์ œ ์ถœ์‹œ๋ ์ง€ ์˜ˆ์ƒ์ด
PR #959๋Š” ์ด ๋ฌธ์ œ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„, ๋ฆฌ๋””๋ ‰์…˜ ํ”„๋ก์‹œ์™€ ๊ฐ™์€ ๊ธฐํƒ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฏ€๋กœ ๋‚˜์ค‘์— ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #959์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋ฉฐ ๋ช‡ ๋ถ„ ์•ˆ์— ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Sitronik ๋•๋ถ„์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@jan-molak์˜ ์ˆ˜์ •์ด ๋‚ด ํ•˜๋ฃจ๋ฅผ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค.
PR ๋ณ‘ํ•ฉ์— +1.

์ด๊ฒƒ์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ +1!!

๊ฐ™์€ ๋ฌธ์ œ... ๋ณ‘ํ•ฉํ•˜์‹ญ์‹œ์˜ค!

์—ฌ๊ธฐ์„œ๋„ ๊ฐ™์€ ๋ฌธ์ œ

@Sitronik ๋•๋ถ„์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉํ•˜์‹ญ์‹œ์˜ค!
๊ทธ๋Ÿฌ๋‚˜ ํ”„๋ก์‹œ ์„ค์ •์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(http_proxy / https_proxy)์—์„œ ์ฝํžˆ์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ AxiosRequestConfig์˜ ์ผ๋ถ€๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

+1 ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ด ์ž‘์—…์„ ์ฆ‰์‹œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

+1 ์ด๊ฒƒ์„ ๊ณ ์น  ๋•Œ? ํ•˜์ง€๋งŒ no_proxy๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค...

@Sitronik์€ PR์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. axios-https-proxy-fix ํŒจํ‚ค์ง€๊ฐ€ axios.defaults.proxy = {host: ip, port: port}

์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ทธ ๋’ค์— ๋งŽ์€ ์ปค๋ฐ‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ์š”? :S

๊ทธ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ทธ ๋’ค์— ๋งŽ์€ ์ปค๋ฐ‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” node-fetch + httpsProxyAgent + bluebird๋กœ ๊ฐ€๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@Makoehle

์ด๋ด, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ž‘๋™ ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ http ๋ฐ https๋ฅผ ""๋กœ ๋‚ด๋ณด๋‚ด์‹ญ์‹œ์˜ค.

export http_proxy="" && export https_proxy=""

env ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๋‹ค. ์ œ ์ถ”์ธก์œผ๋กœ๋Š” #1207๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ‘ํ•ฉ๋„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ ์ด๋ ‡๊ฒŒ ๊ธธ์–ด์š”?

959๊ฐ€ ๋ณ‘ํ•ฉ๋˜์—ˆ์œผ๋ฉฐ 0.19.0-beta.1์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

0.19.0-beta.1์—์„œ๋Š” ํ•ด๊ฒฐ์ด ์•ˆ๋˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค

// default axios usage
import * as ProxyAgent from "proxy-agent";
const proxyAgent = new ProxyAgent(process.env.HTTPS_PROXY);  // http://127.0.0.1:1080
Axios.defaults.httpsAgent = proxyAgent;
Axios.defaults.proxy = false;

// google api usage
const Sheets = google.sheets({
    version: "v4",
    auth: key,
    httpsAgent: /dev/.test(process.env.NODE_ENV) ? proxyAgent : false,
    proxy: false
});

0.19.0-beta.1์ด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ ์ƒˆ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Khaledgarbaya 0.19.0-beta.1์—์„œ ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ์งˆ๋ฌธ์€ ๋‚ด ํ”„๋ก์‹œ ์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์ž…๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  isHttps ํ”Œ๋ž˜๊ทธ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?).

HTTP๋ฅผ ํ†ตํ•œ HTTPS์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋ก์‹œ์— ๋Œ€ํ•œ http URL/ํฌํŠธ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค์ •ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

axiosRequestOptions.proxy = {
            host: '192.0.01',
            port: '8888',
            // isHttps: true, ?
        }

์ฆ‰, ์œ„์˜ ๋‚ด์šฉ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์‹คํŒจํ•˜๋ฏ€๋กœ ํ”„๋ก์‹œ ์†์„ฑ/๊ฐ์ฒด์˜ ๊ตฌ์กฐํ™”๊ฐ€ ์›์ธ์ธ ๊ตฌ์„ฑ/๋ฌธ์„œ ๋ฌธ์ œ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@necevil
ํ˜ธ์ŠคํŠธ: '192.0.01'

0.19.0-beta.1์€ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๊ณ„์† Request failed with status code 400 . ์ด๊ฒƒ์— ๋งŽ์€ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ „ํ™˜ํ–ˆ๊ณ  ์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

const axios = require('axios-https-proxy-fix')

๋‚˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

0.18.0 ์—…๋ฐ์ดํŠธํ•œ ํ›„ ์ด๊ฒƒ์ด ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๋‹ค์Œ ์˜ต์…˜์„ ์ง€์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

axios.get('<some_url_on_corporate_intranet>', {
        proxy: false,
        httpsAgent: https.Agent({
            rejectUnauthorized: false // Allows the use of self-signed certificates (not recommended)
    })

axios 0.18์—์„œ ๋ชจ๋“  ์†”๋ฃจ์…˜๊ณผ ๋ชจ๋“  ์‹คํŒจํ•œ ๊ธฐ๋ฐ˜์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰ ํ•ด๊ฒฐ์ฑ… :
nginx ๋ชจ๋“ˆ ngx_http_proxy_connect_module ์„ค์น˜
๊ทธ๋Ÿฐ ๋‹ค์Œ request -promise๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ http ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด https URL์„ ์š”์ฒญํ•˜์‹ญ์‹œ์˜ค.

์š”์ฒญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Nginx๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ์ฒ˜๋ฆฌ ํ”„๋ก์‹œ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

-
์•ˆํ† ๋‹ˆ

2019๋…„ 1์›” 17์ผ ์˜คํ›„ 8์‹œ 44๋ถ„์— redbearder [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

axios 0.18์—์„œ ๋ชจ๋“  ์†”๋ฃจ์…˜๊ณผ ๋ชจ๋“  ์‹คํŒจํ•œ ๊ธฐ๋ฐ˜์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰ ํ•ด๊ฒฐ์ฑ… :
nginx ๋ชจ๋“ˆ ngx_http_proxy_connect_module ์„ค์น˜
๊ทธ๋Ÿฐ ๋‹ค์Œ request-promise๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ http ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด https URL์„ ์š”์ฒญํ•˜์‹ญ์‹œ์˜ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

์š”์ฒญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Nginx๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ์ฒ˜๋ฆฌ ํ”„๋ก์‹œ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. - ์•ˆํ† ๋‹ˆ
โ€ฆ
2019๋…„ 1์›” 17์ผ ์˜คํ›„ 8์‹œ 44๋ถ„ redbearder @ . * > ์ž‘์„ฑ: axios 0.18 ์ตœ์ข… ์†”๋ฃจ์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ•˜๊ณ  ๋ชจ๋‘ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ข… ์†”๋ฃจ์…˜: nginx ๋ชจ๋“ˆ ngx_http_proxy_connect_module์„ ์„ค์น˜ํ•œ ๋‹ค์Œ request-promise๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ http ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด https URL์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

๋‹ต์žฅ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ํ”„๋ก์‹œ ๊ฒŒ์ดํŠธ์›จ์ด๋กœ ๋‹จ์ผ IP ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ๋ณด๋‚ผ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์š”์ฒญ ์•ฝ์†์€ "RequestError: ์˜ค๋ฅ˜: ํ„ฐ๋„๋ง ์†Œ์ผ“์„ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ 400" ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋…ธ๋“œ์—์„œ ์†”๋ฃจ์…˜์„ ์ฐพ์ง€ ๋ชปํ•œ ๋‹ค์Œ ๊ฒŒ์ดํŠธ์›จ์ด ์ธก์—์„œ ์ˆ˜์ •ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ•ด๊ฒฐ์ฑ…์ด ์œ„์— ๋‚˜์˜ต๋‹ˆ๋‹ค.

2๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๋„ ๊ณ ์žฅ!!!

์š”์ฒญ ์•ฝ์†์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์•ˆํ† ๋‹ˆ
http://profullstack.com

2019๋…„ 7์›” 18์ผ ์˜ค์ „ 7์‹œ 5๋ถ„์— Yassien [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

2๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๋„ ๊ณ ์žฅ!!!

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

์ด๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์—ฌ์ „ํžˆ axios๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋‚ด๊ฐ€ ํ•œ ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

const HttpsProxyAgent = require("https-proxy-agent"),
      axios = require("axios");

const httpsAgent = new HttpsProxyAgent({host: "proxyhost", port: "proxyport", auth: "username:password"})

//use axios as you normally would, but specify httpsAgent in the config
axios = axios.create({httpsAgent});

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด http ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํ•˜๊ณ  ๊น”๋”ํ•˜๊ฒŒ https ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€ ์ด ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ ์ฐธ์—ฌํ•˜์—ฌ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฐฉ๊ธˆ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
proxy-agent ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” czl032405์˜ ์†”๋ฃจ์…˜์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

0.19.0 ๋ฆด๋ฆฌ์Šค์— ๋”ฐ๋ฅด๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ axios 0.19์—์„œ ์—ฌ์ „ํžˆ ๊นจ์กŒ์Šต๋‹ˆ๋‹ค.
๋ฒ„์ „ 0.19.0์ด ์‹คํŒจํ•˜๊ณ  _"์˜ค๋ฅ˜: ํ”„๋กœํ† ์ฝœ "http:"๊ฐ€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "https:"๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค."_
๋ฒ„์ „ 0.19.1์€ _"์˜ค๋ฅ˜: ์‹œ๊ฐ„ ์ดˆ๊ณผ 1000ms ์ดˆ๊ณผ"_์™€ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๋Š˜๋ ค๋„ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. axios๊ฐ€ GET ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋™์•ˆ ํ”„๋ก์‹œ ์„œ๋ฒ„๋Š” CONNECT ์š”์ฒญ์„ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

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