まえがき
株式会社ピーアールオー(あったらいいな!を作ります) Advent Calendar 2021 の14日目になります。
前日は @s_arakawa626 さんの「脆弱性のあるサーバーを簡単に立ててサイバー攻撃を体験したい」でした。
URLの最大長はIEによって決められていた問題
周知の事実だと思うのですが、URLの長さに仕様としての決めはないのに、IEが2083文字までしか利用できないため、Webの世界ではURLの最大長は2083というのが事実上の標準というか、常識になっていましたよね。。。
URLの長さの仕様は本当にないのか?問題
URLに関する仕様と言えばRFCですね。URLに関するRFCは、RFC2616とRFC3986が原典となります。2616と3986の記載には、たとえばURLで使用できる文字種について違いがあったりでしばしば現場に混乱をもたらしていますが、ことURLの長さに関しては双方とも規定がないというのが通説でした。
その後、RFC7230が規定(これにより2616が廃用となった)されましたが、7230ではじめてURL長に関する言及が以下のようにされるようになりました(Section-3.1.1)。
Various ad hoc limitations on request-line length are found in
practice. It is RECOMMENDED that all HTTP senders and recipients
support, at a minimum, request-line lengths of 8000 octets.
つまり、RFC上では8000文字までは対応できることが望ましい的なことが書かれているわけですね。(そして相変わらず上限は設けられてない)
FC7230が公開されたのは2014年ですから、当初のIEがこれに従ってなかったのはやむを得ないものの、IEが存命中は2083文字制限は生き続け、Webにおける常識のようになっていたと記憶しています。
IE亡き後のWeb
でも、もうすぐ(2022/6)IEはいなくなります。謎の仕様により我々を苦しめていた王がWWWの世界から退場するのです。王亡き後のWebの姿として、URLの最大長に関して我々はどこに指針を求めていけばいいのでしょうか。本記事の主題はそこにあります。
各ブラウザの対応
実は少し前にQiitaでも実際に調べられた方がいました。
各種OS/ブラウザでの長いフラグメントのあるURLの長さを調べてみました
FFは青天井(限界がよくわからない)で、Chromeは10000文字を超えると表示上の問題(アドレスバーで表示しきれない・コピーできない等の問題がでる)、safariでは同様に4096で表示限界(ただしこれを超えるURLを開くことはできる)となっていました。そして、Edgeはなんと2083文字制約をIEから引きずっているとのこと。マジすか。。。
正直この記事を見てやっぱり2083文字が制約なのかぁと思いかけたんですが、一応自分の手で軽くさっと確認してみたいですよね。
リクエスト受け取ってそれを返す単純なコードを書けば最低限確認できそうですが、さっと確認したいので世の中にある便利サイトを使ってみました。いくつか見つけたサイトのうちリンクフリーとなっていた以下サイト様を使わせていただきました。
[単位変換、進数変換等の便利なWEBアプリ集 (hogehoge.tk)]
当然ながら、URLの長さ上限という要素にはサーバ側アプリケーションやNW機器の対応といった要素もあるわけですが、今回はいったんブラウザによる制約がどうなってるのか?に主眼を置くことで、サーバ側の対応については置いておくことにしました。やってみないとわからないですが、ひとまずRFC7230で推奨された8000文字までいければ御の字でしょう。。。
実施結果
実施は記事執筆時点(2021/12/12)での最新バージョンを使用しています。
URLは適当にクエリをたくさん生成してつくりました。以下のようなパターンです。
https://hogehoge.tk/http/info/?p001=1234&p002=1234&p003=1234&p004=1234&p005=1234&p006=1234&p007=1234&p008=1234&p009=1234&p010=1234&p011=1234&p012=1234&p013=1234&p014=1234&p015=1234&p016=1234&p017=1234&p018=1234&p019=1234&p020=1234&p021=1234&p022=1234&p023=1234&p024=1234&p025=1234&p026=1234&p027=1234&p028=1234&p029=1234&p030=1234&p031=1234&p032=1234&p033=1234&p034=1234&p035=1234&p036=1234&p037=1234&p038=1234&p039=1234&p040=1234&p041=1234&p042=1234&p043=1234&p044=1234&p045=1234&p046=1234&p047=1234&p048=1234&p049=1234&p050=1234&p051=1234&p052=1234&p053=1234&p054=1234&p055=1234&p056=1234&p057=1234&p058=1234&p059=1234&p060=1234&p061=1234&p062=1234&p063=1234&p064=1234&p065=1234&p066=1234&p067=1234&p068=1234&p069=1234&p070=1234&p071=1234&p072=1234&p073=1234&p074=1234&p075=1234&p076=1234&p077=1234&p078=1234&p079=1234&p080=1234&p081=1234&p082=1234&p083=1234&p084=1234&p085=1234&p086=1234&p087=1234&p088=1234&p089=1234&p090=1234&p091=1234&p092=1234&p093=1234&p094=1234&p095=1234&p096=1234&p097=1234&p098=1234&p099=1234&p100=1234&p101=1234&p102=1234&p103=1234&p104=1234&p105=1234&p106=1234&p107=1234&p108=1234&p109=1234&p110=1234&p111=1234&p112=1234&p113=1234&p114=1234&p115=1234&p116=1234&p117=1234&p118=1234&p119=1234&p120=1234&p121=1234&p122=1234&p123=1234&p124=1234&p125=1234&p126=1234&p127=1234&p128=1234&p129=1234&p130=1234&p131=1234&p132=1234&p133=1234&p134=1234&p135=1234&p136=1234&p137=1234&p138=1234&p139=1234&p140=1234&p141=1234&p142=1234&p143=1234&p144=1234&p145=1234&p146=1234&p147=1234&p148=1234&p149=1234&p150=1234&p151=1234&p152=1234&p153=1234&p154=1234&p155=1234&p156=1234&p157=1234&p158=1234&p159=1234&p160=1234&p161=1234&p162=1234&p163=1234&p164=1234&p165=1234&p166=1234&p167=1234&p168=1234&p169=1234&p170=1234&p171=1234&p172=1234&p173=1234&p174=1234&p175=1234&p176=1234&p177=1234&p178=1234&p179=1234&p180=1234&p181=1234&p182=1234&p183=1234&p184=1234&p185=1234&p186=1234&p187=1234&p188=1234&p189=1234&p190=1234&p191=1234&p192=1234&p193=1234&p194=1234&p195=1234&p196=1234&p197=1234&p198=1234&p199=1234&p200=1234&p201=1234&p202=1234&p203=1234&p204=1234&p205=1234&p206=1234&p207=1234&p208=1234&p209=1234&p210=1234&p211=1234&p212=1234&p213=1234&p214=1234&p215=1234&p216=1234&p217=1234&p218=1234&p219=1234&p220=1234&p221=1234&p222=1234&p223=1234&p224=1234&p225=1234&p226=1234&p227=1234&p228=1234&p229=1234&p230=1234&p231=1234&p232=1234&p233=1234&p234=1234&p235=1234&p236=1234&p237=1234&p238=1234&p239=1234&p240=1234&p241=1234&p242=1234&p243=1234&p244=1234&p245=1234&p246=1234&p247=1234&p248=1234&p249=1234&p250=1234&p251=1234&p252=1234&p253=1234&p254=1234&p255=1234&p256=1234&p257=1234&p258=1234&p259=1234&p260=1234&p261=1234&p262=1234&p263=1234&p264=1234&p265=1234&p266=1234&p267=1234&p268=1234&p269=1234&p270=1234&p271=1234&p272=1234&p273=1234&p274=1234&p275=1234&p276=1234&p277=1234&p278=1234&p279=1234&p280=1234&p281=1234&p282=1234&p283=1234&p284=1234&p285=1234&p286=1234&p287=1234&p288=1234&p289=1234&p290=1234&p291=1234&p292=1234&p293=1234&p294=1234&p295=1234&p296=1234&p297=1234&p298=1234&p299=1234&p300=1234&p301=1234&p302=1234&p303=1234&p304=1234&p305=1234&p306=1234&p307=1234&p308=1234&p309=1234&p310=1234&p311=1234&p312=1234&p313=1234&p314=1234&p315=1234&p316=1234&p317=1234&p318=1234&p319=1234&p320=1234&p321=1234&p322=1234&p323=1234&p324=1234&p325=1234&p326=1234&p327=1234&p328=1234&p329=1234&p330=1234&p331=1234&p332=1234&p333=1234&p334=1234&p335=1234&p336=1234&p337=1234&p338=1234&p339=1234&p340=1234&p341=1234&p342=1234&p343=1234&p344=1234&p345=1234&p346=1234&p347=1234&p348=1234&p349=1234&p350=1234&p351=1234&p352=1234&p353=1234&p354=1234&p355=1234&p356=1234&p357=1234&p358=1234&p359=1234&p360=1234&p361=1234&p362=1234&p363=1234&p364=1234&p365=1234&p366=1234&p367=1234&p368=1234&p369=1234&p370=1234&p371=1234&p372=1234&p373=1234&p374=1234&p375=1234&p376=1234&p377=1234&p378=1234&p379=1234&p380=1234&p381=1234&p382=1234&p383=1234&p384=1234&p385=1234&p386=1234&p387=1234&p388=1234&p389=1234&p390=1234&p391=1234&p392=1234&p393=1234&p394=1234&p395=1234&p396=1234&p397=1234&p398=1234&p399=1234&p400=1234&p401=1234&p402=1234&p403=1234&p404=1234&p405=1234&p406=1234&p407=1234&p408=1234&p409=1234&p410=1234&p411=1234&p412=1234&p413=1234&p414=1234&p415=1234&p416=1234&p417=1234&p418=1234&p419=1234&p420=1234&p421=1234&p422=1234&p423=1234&p424=1234&p425=1234&p426=1234&p427=1234&p428=1234&p429=1234&p430=1234&p431=1234&p432=1234&p433=1234&p434=1234&p435=1234&p436=1234&p437=1234&p438=1234&p439=1234&p440=1234&p441=1234&p442=1234&p443=1234&p444=1234&p445=1234&p446=1234&p447=1234&p448=1234&p449=1234&p450=1234&p451=1234&p452=1234&p453=1234&p454=1234&p455=1234&p456=1234&p457=1234&p458=1234&p459=1234&p460=1234&p461=1234&p462=1234&p463=1234&p464=1234&p465=1234&p466=1234&p467=1234&p468=1234&p469=1234&p470=1234&p471=1234&p472=1234&p473=1234&p474=1234&p475=1234&p476=1234&p477=1234&p478=1234&p479=1234&p480=1234&p481=1234&p482=1234&p483=1234&p484=1234&p485=1234&p486=1234&p487=1234&p488=1234&p489=1234&p490=1234&p491=1234&p492=1234&p493=1234&p494=1234&p495=1234&p496=1234&p497=1234&p498=1234&p499=1234&p500=1234&p501=1234&p502=1234&p503=1234&p504=1234&p505=1234&p506=1234&p507=1234&p508=1234&p509=1234&p510=1234&p511=1234&p512=1234&p513=1234&p514=1234&p515=1234&p516=1234&p517=1234&p518=1234&p519=1234&p520=1234&p521=1234&p522=1234&p523=1234&p524=1234&p525=1234&p526=1234&p527=1234&p528=1234&p529=1234&p530=1234&p531=1234&p532=1234&p533=1234&p534=1234&p535=1234&p536=1234&p537=1234&p538=1234&p539=1234&p540=1234&p541=1234&p542=1234&p543=1234&p544=1234&p545=1234&p546=1234&p547=1234&p548=1234&p549=1234&p550=1234&p551=1234&p552=1234&p553=1234&p554=1234&p555=1234&p556=1234&p557=1234&p558=1234&p559=1234&p560=1234&p561=1234&p562=1234&p563=1234&p564=1234&p565=1234&p566=1234&p567=1234&p568=1234&p569=1234&p570=1234&p571=1234&p572=1234&p573=1234&p574=1234&p575=1234&p576=1234&p577=1234&p578=1234&p579=1234&p580=1234&p581=1234&p582=1234&p583=1234&p584=1234&p585=1234&p586=1234&p587=1234&p588=1234&p589=1234&p590=1234&p591=1234&p592=1234&p593=1234&p594=1234&p595=1234&p596=1234&p597=1234&p598=1234&p599=1234&p600=1234&p601=1234&p602=1234&p603=1234&p604=1234&p605=1234&p606=1234&p607=1234&p608=1234&p609=1234&p610=1234&p611=1234&p612=1234&p613=1234&p614=1234&p615=1234&p616=1234&p617=1234&p618=1234&p619=1234&p620=1234&p621=1234&p622=1234&p623=1234&p624=1234&p625=1234&p626=1234&p627=1234&p628=1234&p629=1234&p630=1234&p631=1234&p632=1234&p633=1234&p634=1234&p635=1234&p636=1234&p637=1234&p638=1234&p639=1234&p640=1234&p641=1234&p642=1234&p643=1234&p644=1234&p645=1234&p646=1234&p647=1234&p648=1234&p649=1234&p650=1234&p651=1234&p652=1234&p653=1234&p654=1234&p655=1234&p656=1234&p657=1234&p658=1234&p659=1234&p660=1234&p661=1234&p662=1234&p663=1234&p664=1234&p665=1234&p666=1234&p667=1234&p668=1234&p669=1234&p670=1234&p671=1234&p672=1234&p673=1234&p674=1234&p675=1234&p676=1234&p677=1234&p678=1234&p679=1234&p680=1234&p681=1234&p682=1234&p683=1234&p684=1234&p685=1234&p686=1234&p687=1234&p688=1234&p689=1234&p690=1234&p691=1234&p692=1234&p693=1234&p694=1234&p695=1234&p696=1234&p697=1234&p698=1234&p699=1234&p700=1234&p701=1234&p702=1234&p703=1234&p704=1234&p705=1234&p706=1234&p707=1234&p708=1234&p709=1234&p710=1234&p711=1234&p712=1234&p713=1234&p714=1234&p715=1234&p716=1234&p717=1234&p718=1234&p719=1234&p720=1234&p721=1234&p722=1234&p723=1234&p724=1234&p725=1234&p726=1234&p727=1234&p728=1234&p729=1234&p730=1234&p731=1234&p732=1234&p733=1234&p734=1234&p735=1234&p736=1234&p737=1234&p738=1234&p739=1234&p740=1234&p741=1234&p742=1234&p743=1234&p744=1234&p745=1234&p746=1234&p747=1234&p748=1234&p749=1234&p750=1234&p751=1234&p752=1234&p753=1234&p754=1234&p755=1234&p756=1234&p757=1234&p758=1234&p759=1234&p760=1234&p761=1234&p762=1234&p763=1234&p764=1234&p765=1234&p766=1234&p767=1234&p768=1234&p769=1234&p770=1234&p771=1234&p772=1234&p773=1234&p774=1234&p775=1234&p776=1234&p777=1234&p778=1234&p779=1234&p780=1234&p781=1234&p782=1234&p783=1234&p784=1234&p785=1234&p786=1234&p787=1234&p788=1234&p789=1234&p790=1234&p791=1234&p792=1234&p793=1234&p794=1234&p795=1234&p796=1234&p797=1234
ちなみに、確認に用いたサイトは8000文字URLは対応されており、8210文字までは正常動作を確認できました(これを超えるとエラー)。RFC7230の推奨を満たしているという事で必要十分な仕様で作られていますね!
また、URL長という制約を考える際、ドメイン部分、パス部分、クエリストリングス部分でそれぞれ限界値が存在しうる可能性はありますが、いったん本記事ではそこは目をつぶっており、URL文字列全体の長さで考えていくことにします。
Chrome(Win)
前評判通り全く問題なさそうです。すべてのGETパラメータが正常に送信されており、アドレスバーにおける表示も途中で切れたりはしていません。
Firefox
Edge
さぁ、ここらでいよいよ問題のEdgeを見てみたいと思います。
IEの悪しき因習を今も引きずっているのでしょうか・・・
お!?
おお。。。
なんと、リクエストも正常に飛んでるし、アドレスバーでもすべてのURLが表示されています。
予想に反して、今のEdgeはIEの古い常識を捨て去ったように見えます。
Chrome(Android)
Android 9のChromeで確認
リクエストもアドレスバーでの表示もCopyも問題なし
(キャプなし)
Safari(Mac)
今触れる環境がないので後日調べます
Safari(iOS)
どうやら4096文字までしかアドレスバーでは扱えないようです(コピペも同じ)。Safariに関しては各種OS/ブラウザでの長いフラグメントのあるURLの長さを調べてみましたにおける結果を追認する形となりましたね。
結論
IE亡き後、URLの長さについてはSafariが制限要因となっていて、その長さは4096文字まで1。
IE統治時代よりURL長は倍になりましたが、依然制約は存在するという事を我々は知っておく必要がありそうです。
まぁそんな長いURL使うWebアプリを設計すなよという話でもあるのですが・・・^^;
※冒頭でも述べましたが、実際のURL長に関する制約としてはNW機器やサーバ側アプリケーションの対応なども要因として影響を与えうるため、本記事におけるブラウザによる制約だけで決められるものではない点はご承知おきください。
-
リクエストは正常に飛ばせるので表示だけの問題と言えばその通りですが、表示されなかったりコピペできなかったりというのはURLとしての可搬性・再利用性が制限されるわけで、やはりこのあたりを上限として考えておくという方が良いかと思っています。 ↩