Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】How to Build a Bitly-Like URL Shortener API with Node + Express

2025年09月29日に「Dev.to」が公開したITニュース「How to Build a Bitly-Like URL Shortener API with Node + Express」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Node.jsとExpressでBitly風のURL短縮APIを構築する。長いURLを短いID付きリンクに変換し、アクセス時に元のURLへリダイレクトする機能を持つ。URLの検証・正規化、ID生成、インメモリ保存、悪質URLのブラックリスト化も実装する手順を紹介。

ITニュース解説

システムエンジニアを目指す初心者の皆さん、こんにちは。今回は、皆さんが普段ウェブサイトで目にするURL(Uniform Resource Locator)を短くするサービス、例えば「Bitly」のようなものを、自分で開発する方法について解説する。この解説を通して、サーバーサイドのプログラムがどのように動作し、どんな技術が使われているのかを学ぶことができる。

私たちが今回開発するのは、長いURLを短く変換し、その短いURLにアクセスすると元の長いURLへ自動的に移動(リダイレクト)させる機能を持つAPI(Application Programming Interface)だ。APIとは、異なるソフトウェア同士が情報をやり取りするための窓口のようなものと理解してほしい。具体的には、以下の二つの主要な窓口(エンドポイント)を用意する。

一つ目は、POST /shortenという窓口だ。ここに元の長いURLを送ると、サーバーはそのURLを保存し、新しく生成した短いIDを含むURLを返してくれる。これは、「このURLを短くしてほしい」というリクエストをサーバーに送るイメージだ。

二つ目は、GET /:shortIdという窓口だ。この:に続くshortIdの部分には、短縮されたURLの短いIDが入る。この窓口にアクセスすると、サーバーは保存しておいた元の長いURLを探し出し、そこに自動的に転送してくれる。これが、短いURLから元のURLへ移動する仕組みである。

このプロジェクトでは、Node.jsというJavaScriptでサーバーを動かすための環境と、ExpressというNode.jsでWebアプリケーションを簡単に構築するためのフレームワークを使う。まずは、開発を始めるための準備として、bitly-liteという名前の新しいフォルダを作成し、その中でプロジェクトを初期化し、expressと、ユニークな短いIDを生成するためのnanoidという便利なツールをインストールする。

次に、サーバーのプログラム本体となるserver.jsというファイルを作成する。このファイルにexpressを読み込み、サーバーを動かすためのインスタンスを作り、コンピューターの特定の番地(ポート5000)でリクエストを受け付けられるように設定する。これで、基本的なサーバーが動き出す準備が整う。

保存するURLのデータをどこに置くかという問題があるが、今回はシンプルさを優先し、urlsという名前のJavaScriptのオブジェクト(辞書のようなもの)を一時的なデータベースとして利用する。このオブジェクトには、短いIDをキー(鍵)として、それに対応する元の長いURLを値として保存する。例えば、'0si_Cq': 'https://learnbackend.dev'のように、短いIDと元のURLがペアで格納される形だ。ただし、この方法はサーバーが停止するとデータが消えてしまうため、実際の製品として運用する場合には、JSONファイルやMySQLのようなちゃんとしたデータベース、あるいはRedisのようなキャッシュシステムを使う必要があるという点には注意が必要だ。

いよいよURLを短縮する機能の実装に取り掛かる。POST /shortenという窓口の処理を記述していく。クライアント(利用者のブラウザやアプリなど)から送られてくるリクエストの本体がJSON形式であることを想定し、express.json()というミドルウェアを使って、自動的にJSONデータをJavaScriptのオブジェクトに変換できるようにする。

まず、リクエストの中から短縮したい元のURL(originalUrlという名前で送られてくる)を取り出す。もしこのURLが送られてこなかったり、空っぽだったりした場合は、HTTP 400 Bad Request(リクエストが不正であるというエラー)をクライアントに返す。これは、サーバーが何を処理すれば良いのかわからない状態を防ぐための基本的なバリデーション(検証)だ。

次に、受け取ったURLを「正規化」する作業が重要になる。これは、見た目は少し違っても、実際には同じ場所を指すURLを同じものとして扱うための処理だ。例えば、「https://example.com/」と「https://example.com」は同じサイトを指すが、そのままでは別のURLとして認識されてしまう可能性がある。そこで、URLの両端の空白を削除したり、スキーム(http://https://)がなければhttps://を自動で追加したりする。また、Node.jsに標準で備わっているURLクラスを使って、URLの形式がそもそも正しいかをチェックし、不正な場合はエラーを返す。さらに、URLのパス部分にある重複するスラッシュ(//)や末尾のスラッシュを削除したり、クエリパラメータ(URLの?以降の部分)をアルファベット順に並べ替えたりして、URLの表現を統一する。標準のポート番号(HTTPの80番やHTTPSの443番)が指定されていればそれも削除し、最後に整形されたURLを文字列として取得する。これらの正規化を行うことで、同じURLを誤って複数回登録してしまうことを防ぎ、無駄なIDの消費を防ぐことができる。

URLが正規化されたら、いよいよ短縮URLの生成と保存だ。まず、すでに同じ元のURLがデータベースに存在しないかをチェックする。もしあれば、新しくIDを生成する代わりに、既存の短いURLをクライアントに返す。これにより、同じURLに対して毎回新しい短いIDを生成する無駄を省き、データベースの容量も節約できる。 もし新しいURLであれば、nanoidを使って6文字のユニークなIDを生成する。このIDが既存のものと重複しないように確認し、安全なIDを生成したら、それをキーとして正規化された元のURLをurlsオブジェクトに保存する。そして、この新しい短いIDを含む短縮URL(例えば http://127.0.0.1:5000/短いID のような形)をクライアントに返す。

短縮URLができたら、今度はその短いURLにアクセスしたときに元のURLにリダイレクトする機能を作る。これがGET /:shortId窓口の役割だ。クライアントから送られてきた短いID(shortId)が、6文字の英数字、ハイフン、アンダースコアで構成されているかを正規表現でチェックする。もし形式が正しくなければ、HTTP 400 Bad Requestを返す。次に、この短いIDを使ってurlsオブジェクトから元のURLを探し出す。もし対応するURLが見つからなければ、HTTP 404 Not Found(ページが見つからないというエラー)を返す。そして、もし元のURLが見つかれば、res.redirect()というExpressの機能を使って、クライアントをその元の長いURLへ自動的に転送する。これにより、ユーザーは短いURLをクリックするだけで、目的のウェブページに到達できるのだ。

最後に、セキュリティ対策として、悪意のあるURLや私的なネットワークのURLを短縮させないためのブラックリスト機能を実装する。URL短縮サービスは、攻撃者が悪質なリンクを隠すために悪用される可能性があるため、このような対策は非常に重要だ。 具体的には、あらかじめ「scam.com」や「phishing.net」といった特定のドメイン名をブラックリストとして登録する。さらに、localhostや特定のプライベートIPアドレス範囲(例えば127.0.0.0/8192.168.0.0/16など、社内ネットワークや開発環境で使われるアドレス)へのリンクも短縮できないように制限する。POST /shorten窓口の処理の中で、入力されたURLのホスト名がこのブラックリストに含まれていないか、あるいは指定されたIPアドレス範囲に該当しないかをチェックする。もし該当する場合は、HTTP 403 Forbidden(リクエストは正しいが、アクセスが許可されないというエラー)をクライアントに返す。これにより、サービスが悪用されるリスクを減らすことができる。

これらのステップを経て、Node.jsとExpressを使って、URLの検証、正規化、短縮IDの生成、データの保存とリダイレクト、そして基本的なセキュリティチェックまで備えた、BitlyのようなURL短縮サービスを構築できる。この経験は、システムエンジニアとしてバックエンド開発の基礎を理解するための貴重な一歩となるだろう。

関連コンテンツ

関連IT用語

関連ITニュース