ユーザー名をURLに含めるなら@始まりにするとよさそう
SNSなど、ユーザー名をURLに含めているサービスは色々ある。このZennもそうだ。ただ、考えることが多い。例えば以下の点だ。
- システムで使いたい文字列をユーザー名に使われる可能性があるので、ユーザー名に使えない膨大な文字列のリストを管理する必要がある
- 実装に失敗すると、一部のユーザーだけ特別扱いするルーティングを独自実装する必要が出かねない
- 簡単な対応策としては
/user/{ユーザー名}
のようなURLの規則にすること- これを採用しているサービスもあるが、見た目がダサいからか、あまり好まれていない印象がある
ということで、現実的な解決策として @user_name
みたいな@始まりのURLにする方法がある。
自分が知る限り、最初にこれをやったのはMediumだが、Mediumは現在サブドメインにするルールになったようで、いつの間にかこの形式を辞めてしまった。
実はTwitter(現X)も一時期移行を試みていた。途中で諦めたようで、現在はリダイレクトのみが行われている。たとえば https://x.com/@catatsuy
にアクセスするとリダイレクトされることが分かるはずだ。
しかし、最近復権しつつあるように思う。
一番大きいのはYouTubeだと思う。自分のYouTubeチャンネルのURLは https://www.youtube.com/@catatsuy
で、@始まりだ。既に閉鎖済みだが、Post Newsもこの形式だった。
そして先日リリースされたmixi2もこの規則を採用している。私のmixi2のURLは https://mixi.social/@catatsuy
だ。
この規則の欠点としては以下の点が挙げられるだろう。
- URLとしては見慣れないので少し異質
- 対応していないルーティングライブラリがたまに存在する
- とはいえ、対応しているルーティングライブラリを選定すればよいだけではある
なぜ自分がこのルールにこだわっているのかというと、昔MediumのURLを見て「おしゃれだ」と思い、実装をしたことがあるからだ。
このリポジトリにはいくつかの言語ライブラリで@始まりのURLを定義している。例えば以下だ。
r.Get(`/@{accountName:[a-zA-Z]+}`, getAccountName)
get '/@:account_name' do
$app->get('/@{account_name}', function (Request $request, Response $response, $args) {
こういう実装にした理由は、当時Mediumを使っていて、MediumのURL規則がおしゃれで今後デファクトスタンダードになると思っていたからだ。その後、この形式は下火になったように見えたが、最近復権してきたことは純粋にうれしい。こういう実装を頭の片隅に入れておくと、将来役に立つ人もいると思うので、改めて書いてみた。
Appendix: RFC 3986
見慣れないURLなので、RFC違反ではないかと思う人もいるかもしれない。RFC3986の3.3 Pathには以下の記述がある。
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
なので、@と:が利用できることが明記されている。他の文字についてはAppendix A. Collected ABNF for URIにまとめられていて、抜粋すると以下の通りだ。
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
pct-encoded = "%" HEXDIG HEXDIG
ということで、@始まりのURLはRFC違反ではない、というのが結論である。
Discussion
URLに
@
を含めるのはフィッシング攻撃の観点で自分は良くないかと思っています。というのも、以下のようなブラウザの挙動があるからです。 これを利用すると、
/
に見た目が似ている⁄
を用いたりすると、https://x.com⁄@catats.uy
などの見た目での見分けがより困難なhttps://catats.uy
へ飛ぶフィッシング攻撃のURLが作れるようになってしまいます。これを考えると、あまり
@
をURLのパスに利用するのはお勧めできない気がしています。多くのサービスはユーザー名などに
.
を許可してないと思われるのと、多くのサービスで使われ始めているからブラウザが対策すべき話だと思います。RFC上は許可されているURLを使うなという話の方が不自然と思います。迅速な返信ありがとうございます!
多くのサービスで
.
を許可していないのに関してはそうなのですが、リンクを踏む人が.
が入っているからと言ってそこまで大きく踏む確率が下がらないと思っています。少なくとも、
@
の仕様不使用に関わらず.
が入るのは変わらないのを考えると、@
を正規のURLに入れることでのリンクの踏みやすさの向上とは独立な問題と思っています。また、「ブラウザが対策すべき」については同意なのですが、現状この問題があるのも事実で対策されるまではサイト側が運用でカバーするしかないと思っています。
いずれにしても、「絶対ダメ」ではないですが「意識した方が良い」程度にはある欠点だとは思っており、欠点として触れる程度はしておいた方が良い事柄かと自分は思います。