axios(アクシオス)は、ブラウザとNode.jsの両方で同じ書き方ができるPromiseベースのHTTPクライアントです。npmの集計では、2026年8月1日〜10月16日のダウンロード数が1週間あたり約6,700万〜1億3,900万回で推移しており、JavaScriptのHTTP通信ライブラリでは定番の位置にあります。米国のニュースメディア「Axios」や、決済のクラウド型アクワイアリングシステム「Axios」とは別物です。
この記事では、2026年10月時点の最新版1.20.0へ上げるべき理由、プロジェクトに入っている版の確認方法、1.x系の変更履歴と2026年の脆弱性の修正版、基本の使い方からプロキシ設定・エラー処理・キャンセル・TypeScriptまでを、Node.js v26.5.0とaxios 1.20.0で動作を確認した処理をもとに説明します。コード例の api.example.com は実際のAPIのURLに、getToken と redirectToLogin は自分のアプリの関数に置き換えてください。/me のような相対パスは、baseURL を設定したインスタンスか、ブラウザ上で実行する場合に使えます。
まとめ:最新バージョンと確認・更新の要点
- 最新版は1.20.0(npm公開 2026年8月26日)。0.x系の保守版は0.34.0(2026年9月16日)で、npmのタグは
v0xです。次の1.21.0はGitHubでリリース準備の変更が10月21日に取り込まれましたが、10月24日時点でnpmには出ていません。 - 1.19系以前は更新が必要です。2026年に公開された脆弱性情報は6回・48件(high 19件)あり、直近の9月16日分12件は、1.x系では1.20.0以降でしか修正されていません。
- 版の確認は
npm ls axios。直接入れた版だけでなく、他パッケージ経由で入った古い版も一覧に出ます。 - 2026年3月31日に公開された1.14.1と0.30.4は不正版で、npmから削除済みです。lockファイルに残っていないかを確認してください。
- タイムアウトの既定値は0(無制限)です。
axios.createでtimeoutを必ず指定し、キャンセルはAbortControllerを使います(CancelTokenは非推奨)。
axiosの特徴とfetch・kyとの違い
axiosは実行環境に合わせて通信方式(アダプタ)を切り替えます。既定の優先順は ['xhr', 'http', 'fetch'] で、ブラウザではXMLHttpRequest、Node.jsでは標準の http モジュールを使います。fetchアダプタはv1.7.0で追加され、どちらも使えない環境で選ばれるほか、adapter: 'fetch' で明示指定もできます。
読み方は日本語圏では「アクシオス」が一般的です。公式READMEに発音の表記はありません。
fetch・kyとの比較表
| 項目 | axios 1.20.0 | fetch(標準) | ky 2.2.0 |
|---|---|---|---|
| 導入 | npm install | 不要 | npm install |
| 対応実行環境 | ブラウザ・Node.js | ブラウザ・Node.js 18以降 | ブラウザ・Node.js 22以降 |
| 4xx・5xx応答 | 例外にする | 例外にしない | 例外にする |
| JSONの変換 | 送受信とも自動 | 受信:.json()/送信:JSON.stringify() | 受信:.json()/送信:jsonオプション |
| タイムアウト既定値 | 0(無制限) | なし | 10000ミリ秒 |
| 自動リトライ | なし | なし | 既定で最大2回 |
| 共通処理の差し込み | インターセプター | なし | hooks |
kyの値はkyのREADME(2.2.0)の既定値です。Node.jsのfetchはv18.0.0でフラグなしで使えるようになり、v21.0.0で実験的機能の扱いが外れました。ブラウザとNode.js 18以降だけを対象に、呼び出し箇所が数か所しかないなら、fetchで十分です。依存を1つ増やせば、2026年3月の不正版公開のようなサプライチェーン攻撃を受ける経路も1つ増えます。
逆に、全リクエストへの認証ヘッダ付与、401応答時の共通処理、タイムアウトの統一が必要な業務アプリでは、axiosのインスタンスとインターセプターを使うとコードを短くできます。外部APIとの連携を設計から任せたい場合は、API開発・システム連携の支援でも相談を受け付けています。Node.js 22未満も対象に含み、かつリトライを標準で持たせたい場合は、kyではなくaxiosに後述のリトライ用パッケージを組み合わせます。
axiosのインストール手順:npm・yarn・pnpm・CDN
パッケージマネージャーごとのコマンドは次のとおりです。READMEではbun(bun add axios)とDeno(deno add axios)の手順も案内されています。
npm install axios
yarn add axios
pnpm add axios
読み込みはESモジュールなら import axios from 'axios';、CommonJSなら const axios = require('axios'); です。ビルドを使わずにHTMLから読み込む場合は、CDNのURLに版番号を固定して書きます。
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js"></script>
TypeScriptの型定義はaxios本体に同梱されています。@types/axios(最終版0.14.4)はnpm上で「axiosは独自の型定義を提供しているため、インストールは不要」と告知されたスタブなので、入っていれば削除して構いません。
axiosのバージョン確認方法:npm ls・npm view・実行時
「インストールされているか」と「どの版が入っているか」は、同じコマンドで確認できます。axios 1.20.0を直接入れ、axios 1.13.6に依存するパッケージを1つ追加したプロジェクトで、各コマンドの出力を確認しました。
| 確認したい内容 | コマンド |
|---|---|
| 入っている全ての版(間接依存を含む) | npm ls axios |
| 直接入れた版だけ | npm ls axios --depth=0 |
| npm上の最新版 | npm view axios version |
| 古い版が残っている場所 | npm outdated axios |
| yarnで依存元をたどる | yarn why axios |
| 実行中のコードから | axios.VERSION |
npm ls axios の出力では、他パッケージ経由で入った版がその依存元の下に表示されます。
[email protected] /private/tmp/axt
+-- [email protected]
`-- [email protected] -> ./dep
`-- [email protected]
--depth=0 を付けると [email protected] の1行だけになり、依存先に残る1.13.6は表示されません。脆弱性や不正版の確認には、--depth=0 を付けない形を使ってください。Windowsでもコマンドは同じで、コマンドプロンプトやPowerShellから package.json のあるフォルダで実行します。何も表示されない((empty))場合、そのプロジェクトにaxiosはインストールされていません。
2026年3月の不正版が入っていないかは、axiosと、不正版が引き込んだ悪性パッケージ plain-crypto-js を並べて調べます。[email protected] か [email protected]、または plain-crypto-js が1行でも出たら、axiosにマルウェア混入(1.14.1・0.30.4)|感染確認・対処と再発防止の設定の手順で端末ごと調べてください。
npm ls axios plain-crypto-js
間接依存に残った古い版をそろえる方法
依存元のパッケージが古い版を固定している場合、npmは package.json の overrides で版を上書きできます。"$axios" は、直接依存に書いた版指定を参照するという意味です。
{
"dependencies": { "axios": "^1.20.0" },
"overrides": { "axios": "$axios" }
}
この設定で npm install し直すと、先ほどの1.13.6は [email protected] deduped に置き換わりました。ただし依存元が古いAPIを前提にしている可能性もあるため、上書き後はその機能のテストを通してください。
axiosのバージョン履歴:1.x系の主な変更点一覧
axiosはv1.0.0からセマンティックバージョニングに従っています。2026年に入ってからはほぼ毎月マイナー版が出ており、その多くにセキュリティ修正が含まれています。日付はnpmの公開日です(GitHubのリリース日とは数日ずれることがあります)。
| 版 | npm公開日 | 主な変更 |
|---|---|---|
| 1.0.0 | 2022-10-04 | semver準拠を開始 |
| 1.7.0 | 2024-05-19 | fetchアダプタを追加 |
| 1.12.0 | 2025-09-11 | data: URLのDoS(CVE-2025-58754)を修正 |
| 1.14.1 | 2026-03-31 | 不正版(npmから削除済み) |
| 1.15.0 | 2026-04-08 | CVE-2026-40175を修正 |
| 1.17.0 | 2026-06-03 | Node.jsでzstd圧縮の展開に対応 |
| 1.18.0 | 2026-06-14 | リダイレクト時の独自認証ヘッダ除去 |
| 1.19.0 | 2026-07-29 | form-dataの下限を4.0.6へ引き上げ |
| 1.20.0 | 2026-08-26 | 413・422の新名称、脆弱性12件修正 |
1.18.0では、sensitiveHeaders に列挙したヘッダが、別オリジンへのリダイレクト時にNode.jsのHTTPアダプタで取り除かれるようになりました。APIキーを独自ヘッダで送っている場合に、リダイレクト先へキーが漏れるのを防げます。1.20.0では、HTTP 413と422の名称として ContentTooLarge と UnprocessableContent が追加され、従来の PayloadTooLarge と UnprocessableEntity は非推奨の別名として残りました。
2026年3月31日の不正版(1.14.1と0.30.4)は、メンテナーのnpmアカウントが乗っ取られて公開されたものです。1.15.0で直ったCVE-2026-40175は、GitHub上の現在の評価がCVSS 4.8(Moderate)です。10.0とされていた評価が下がった経緯はCVE-2026-40175(axios)とは|CVSS10.0から4.8になった経緯と確認・更新手順で解説しています。
次の版は1.21.0です。2026年10月21日にリリース準備のプルリクエスト(版番号の書き換えのみ)が取り込まれましたが、10月24日時点のnpmの latest は1.20.0のままです。公開されたかどうかは npm view axios version で確かめてください。
2026年の脆弱性情報と修正版の一覧
axiosのGitHub Security Advisoriesには、2026年だけで48件が公開されています。公開は数件ずつではなく、まとめて6回に分かれており、それぞれ直る版が違います。
| 公開日 | 件数 | 1.x系の修正版 | 0.x系も対象の件数 |
|---|---|---|---|
| 2026-02-08 | 1件(high 1) | 1.13.5 | 1件(0.30.3) |
| 2026-04-07〜09 | 3件(medium 3) | 1.13.2・1.15.0 | 2件(0.31.0) |
| 2026-04-24 | 13件(high 4・medium 8・low 1) | 1.15.1・1.15.2 | 10件(0.31.1) |
| 2026-05-29〜30 | 9件(high 6・medium 2・low 1) | 1.15.2・1.16.0 | 6件(0.31.1・0.32.0) |
| 2026-07-06 | 10件(high 1・medium 9) | 1.18.0 | 7件(0.33.0) |
| 2026-09-16 | 12件(high 7・medium 5) | 1.20.0 | 2件(0.34.0) |
内訳はプロトタイプ汚染を足がかりにした設定の書き換え、NO_PROXY の回避、HTTP/2やfetchアダプタでの制限漏れが中心です。0.x系の件数が少ないのは、HTTP/2アダプタやfetchアダプタのように1.x系にしか無い機能の問題が多いためで、9月16日分12件のうち10件は影響範囲が1.x系だけです。axios 1.19.0のプロジェクトで npm audit を実行すると、axiosの1項目の下に12件のアドバイザリがまとめて表示されました。
1.20.0へのアップデート手順と更新前の確認
npm install axios@latest
npm ls axios
1.17.0から1.20.0にかけて、設定値をプロトタイプ経由で読まない変更が段階的に入りました。プロトタイプ汚染を悪用した攻撃を防ぐための変更です。通常の書き方には影響しませんが、継承したオブジェクトに設定を置いていたコードでは、更新後に設定が反映されなくなる可能性があります。1.20.0のリリースノートは「互換性への影響はPRを参照」としているため、共通設定を独自の仕組みで組み立てている場合は、更新後に結合テストを回してください。
3月の不正版は公開から約3時間で削除されました。公開直後の版を入れない設定があれば避けられた事故です。npm 11の min-release-age(設定リファレンス)は日数で指定し、npm 11.17.0で --min-release-age=100 を付けると、1.20.0と1.19.0を飛ばして1.18.1が入りました。公開後の待機期間中は脆弱性修正版も導入対象から外れるため、ここでは設定例として3日を指定します。緊急の修正は、修正版の真正性を確認したうえで待機期間を一時的に短縮して取り込みます。
npm install axios --min-release-age=3
axiosの基本的な使い方:GET・POST・PUT・DELETE
レスポンス本体は response.data に入り、JSONは自動で変換されます。オブジェクトを第2引数に渡したPOSTは、Content-Type: application/json で送信されます。
import axios from 'axios';
// GET:paramsはクエリ文字列(?page=2)になる
const res = await axios.get('https://api.example.com/users', { params: { page: 2 } });
console.log(res.status, res.data);
// POST:オブジェクトはJSONとして送られる
await axios.post('https://api.example.com/users', { name: 'Taro' });
// PUT・DELETE
await axios.put('https://api.example.com/users/1', { name: 'Jiro' });
await axios.delete('https://api.example.com/users/1');
フォーム形式(application/x-www-form-urlencoded)で送る場合は、URLSearchParams を渡します。JSON形式との使い分けはapplication/x-www-form-urlencodedとは?application/jsonとの違いと使い分けにまとめています。複数のリクエストを並行して送るときは、非推奨になった axios.all ではなく Promise.all を使います。
axios.createとインターセプターによる共通設定
axios.defaults に認証ヘッダを入れると、axiosから送る全てのドメイン宛てのリクエストにそのヘッダが付きます。READMEもこの点を注意しています。APIごとにインスタンスを分け、ヘッダはインスタンス側で付けてください。ただし baseURL はアクセス制限ではなく、インスタンスに絶対URLを渡せば別ドメインにも送信されます。トークンを付けるインターセプターは、宛先を固定したインスタンスでだけ使ってください。
import axios from 'axios';
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 10000, // 既定は0(無制限)
});
// リクエスト前:トークンを付ける
api.interceptors.request.use((config) => {
config.headers.Authorization = `Bearer ${getToken()}`;
return config;
});
// レスポンス後:401を共通処理し、エラーは呼び出し元へ返す
api.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 401) redirectToLogin();
return Promise.reject(error);
}
);
const { data } = await api.get('/me');
エラー側のハンドラで Promise.reject(error) を返し忘れると、失敗したリクエストが成功扱い(値は undefined)になります。設定の優先順は「ライブラリの既定値→インスタンスの defaults→リクエストごとの設定」で、後に書いたものが勝ちます。ただし data(送信本文)は既定値から継承されません。
axios本体にリトライ機能はありません。READMEにも retry の設定項目はなく、必要なら axios-retry(4.5.0・axios 0.x/1.xに対応)を組み込みます。再試行してよい条件や待ち時間の設計はリトライパターンとは?指数バックオフ・ジッター・リトライ予算の実装判断を解説を参照してください。
Node.jsでのプロキシ設定:proxyオプションとNO_PROXY
社内ネットワークからプロキシ経由で外部APIを呼ぶ場合、Node.jsのaxiosは2通りの指定を受け付けます。proxy オプションでの明示指定と、環境変数 HTTP_PROXY・HTTPS_PROXY・NO_PROXY です(小文字の http_proxy なども使えます)。ブラウザではこの設定は効かず、OSやブラウザのプロキシ設定に従います。
import axios from 'axios';
// 明示指定:authはProxy-Authorization(Basic認証)としてプロキシへ送られる
const api = axios.create({
timeout: 10000,
proxy: {
protocol: 'http',
host: '127.0.0.1',
port: 8080,
auth: { username: 'user', password: 'pass' },
},
});
await api.get('http://api.internal.test/health'); // 127.0.0.1:8080のプロキシ経由で送られる
// 環境変数にプロキシがあっても、このリクエストだけは直接つなぐ
await axios.get('http://api.internal.test/health', { proxy: false });
環境変数で指定する場合は、起動時に渡します。次の例はbash・zshなどのシェル向けで、WindowsのコマンドプロンプトやPowerShellでは環境変数の設定構文が異なります。NO_PROXY にはプロキシを通さない宛先をカンマ区切りで書きます。
HTTP_PROXY=http://127.0.0.1:8080 HTTPS_PROXY=http://127.0.0.1:8080 NO_PROXY=.internal.test,10.0.0.0/8 node app.mjs
リクエストを記録するだけのプロキシをローカルに立て、Node.js v26.5.0で通り道を確かめた結果です。「直接」はプロキシに記録が残らなかったものです。ホスト名宛ては名前解決の失敗(ENOTFOUND)、到達しないIPアドレス10.255.255.1宛てはタイムアウト(ECONNABORTED)で終わりました。
| 設定 | 宛先 | 通り道(1.20.0) |
|---|---|---|
| HTTP_PROXYのみ | api.internal.test | プロキシ経由 |
| NO_PROXY=api.internal.test | api.internal.test | 直接 |
| NO_PROXY=.internal.test | api.internal.test | 直接 |
| proxy: false | api.internal.test | 直接 |
| NO_PROXY=10.0.0.0/8 | 10.255.255.1 | 直接(1.19.0はプロキシ経由) |
CIDR形式で書いた NO_PROXY は1.19.0では無視され、社内向けのIPアドレス宛ての通信までプロキシへ流れました。1.20.0で直ったGHSA-44g4-m2mj-wpvxの挙動です。2026年の脆弱性には NO_PROXY を回避されるものが他にもあり、プロキシで内外の通信を分けているなら1.20.0以上が前提です。
HTTPSの宛先にはCONNECTのトンネルを張り、TLSは宛先と直接結びます。NODE_USE_ENV_PROXY=1 でNode.js自身の環境変数プロキシを有効にすると、環境変数の解釈はNode.jsに任されます(1.20.0のREADME)。
axiosのエラー処理とタイムアウト:AxiosErrorのcode
axiosは2xx以外の応答で例外を投げます。原因は error.code で見分けられます。ローカルにHTTPサーバーを立て、Node.js上でそれぞれの失敗を起こしたときの値は次のとおりでした。
| 状況 | error.code | error.response |
|---|---|---|
| 404などの4xx | ERR_BAD_REQUEST | あり(status 404) |
| 500などの5xx | ERR_BAD_RESPONSE | あり(status 500) |
| タイムアウト(既定) | ECONNABORTED | undefined |
| タイムアウト(clarifyTimeoutError有効) | ETIMEDOUT | undefined |
| 接続拒否(Node.js) | ECONNREFUSED | undefined |
| AbortControllerで中断 | ERR_CANCELED | undefined |
ブラウザでは、CORS違反や混在コンテンツによる失敗も ERR_NETWORK にまとまります。これはブラウザがJavaScriptに理由を渡さない仕様のためで、原因は開発者ツールのコンソールで確認します。CORSの仕組みと設定はCORSとは?仕組み・プリフライト・サーバー設定例・エラー解決を実装目線で解説で扱っています。
try {
await api.get('/slow', { timeout: 5000 });
} catch (error) {
if (axios.isAxiosError(error)) {
if (error.response) {
console.error('HTTPエラー', error.response.status, error.response.data);
} else if (error.code === 'ECONNABORTED' || error.code === 'ETIMEDOUT') {
console.error('タイムアウト');
} else {
console.error('通信エラー', error.code);
}
} else {
throw error;
}
} finally {
hideSpinner(); // 成功・失敗のどちらでも必ず実行する
}
error.response の有無で先に分岐するのがポイントです。タイムアウトや接続エラーでは response が undefined なので、いきなり error.response.status を読むと、エラー処理の中で別のTypeErrorが起きます。ローディング表示の解除のように成否を問わず行う処理は、finally にまとめます(hideSpinner は自分のアプリの関数に置き換えてください)。thenでつなぐ書き方なら .finally() が同じ役割です。
リクエストのキャンセル:AbortControllerの使い方
axiosはv0.22.0からAbortControllerに対応しています。v1.0.0以前の記事でよく見かける CancelToken は、撤回されたTC39提案に基づくAPIで、READMEでは非推奨(deprecated)と明記されています。新しく書くコードでは signal を使ってください。
const controller = new AbortController();
const request = axios.get('/search', { params: { q: 'axios' }, signal: controller.signal });
controller.abort(); // 入力が変わったら前の検索を中断する
try {
await request;
} catch (error) {
if (axios.isCancel(error)) {
console.log('中断された', error.code); // ERR_CANCELED
} else {
throw error;
}
}
検索窓のインクリメンタル検索では、入力のたびに前のリクエストを中断し、不要な通信を減らします。応答後の非同期処理も含めて古い結果の反映を防ぐには、画面更新の直前に、そのリクエストが最新の入力に対応するかも確認してください。
TypeScriptでのaxiosの型付け
ジェネリクスで response.data の型を指定し、エラーは axios.isAxiosError で絞り込みます。次のコードは、TypeScript 7.0.2の --strict で型検査を通ることを確認しています。
import axios from 'axios';
type User = { id: number; name: string };
type ApiError = { message: string };
export async function getUser(id: number): Promise<User | null> {
try {
const { data } = await axios.get<User>(`/users/${id}`);
return data;
} catch (error) {
if (axios.isAxiosError<ApiError>(error)) {
console.error(error.response?.status, error.response?.data?.message);
return null;
}
throw error;
}
}
注意したいのは、axios.get<User> が実行時の検証をしない点です。APIが別の形のJSONを返してもコンパイルは通るため、外部APIの応答はZodなどのスキーマで検証してから使ってください。
よくある質問
axiosの読み方は?
日本語では「アクシオス」と読むのが一般的です。公式の発音表記はありません。同じ名前の米国ニュースメディア「Axios」とは関係ありません。
axiosの最新バージョンはいくつですか?
2026年10月24日時点では1.20.0(2026年8月26日公開)です。1.21.0はリリース準備中で、公開されたかは npm view axios version で確認できます。0.x系の最新は0.34.0です。
axiosのバージョンに脆弱性はありますか?
あります。2026年だけで48件が公開され、最後の9月16日分12件は1.x系では1.20.0以降でしか直っていません。影響する版の範囲は件ごとに違いますが(HTTP/2アダプタのDoSは1.13.0以降など)、npm ls axios で間接依存も含めて1.20.0以上かを確かめるのが確実です。
@types/axiosはインストールが必要ですか?
不要です。型定義はaxios本体に含まれています。@types/axios はnpm上でインストール不要と告知された中身のないパッケージです。
fetchがあればaxiosは不要ですか?
対象がブラウザとNode.js 18以降で、リクエストが少なければfetchで足ります。4xx・5xxを例外として扱いたい、タイムアウトや認証ヘッダを全リクエストでそろえたい、という要件があるならaxiosを使う意味があります。