pixiv MEETUP「数値でみるpixivプロダクトの成長フェーズ - pixivの傾向から紐解く」

2017年9月9日に開催したpixiv10周年記念イベント「pixiv MEETUP -10th Anniversary-」。本イベントではCEOやCTO、エンジニア、プロダクトマネージャーなど様々な立場のメンバーが、これまでどのように考え、どのようにチャレンジしてきたのか技術的知見を交えながら発表を行いました。

本記事では、セッション「数値でみるプロダクトの成長フェーズ - pixivの傾向から紐解く」でのトーク内容をご紹介します。

このセッションでは、アカウントマネージャーの笠原達郎とpixivプロダクトマネージャーの高橋孝太郎が登壇。モデレーターを務める執行役員の清水千年が6つの数字を紹介しながらpixivのこれまでと今を紹介しました。

まずは「4秒」。これはpixivに4秒に1枚投稿されているという意味です。1日約2万件。それを全部目視でチェックしています。

笠原:最初からやっていたわけではないですが、2013年に人の目でチェックするようになりました。「R-18」というカテゴリがあるのですが、ユーザーによっては「ギリギリ見えてなければいいでしょう」と、アダルト色の強い作品を通常カテゴリで投稿するような攻めた行動に出る方もいます。そういった作品の扱いを適切に行うために我々の方で基準線を引いています。

海外は日本以上にレーティングが厳しくてですね。Google AdSenseなどの広告を適切に配信したり、AppleやGoogleのストアにアプリを円滑にリリースしていくためにも始めました。

では次の数字の「83%」。これは、実はコミケ参加者におけるpixiv参加者数の割合です。

高橋:コミケに参加するサークルは、毎回約3万2000サークルです。そのサークルはいろいろなところで作ったものを宣伝したり、Twitterとかで拡散したりしていますが、pixivと連携するとpixivで宣伝できるため多くのユーザーがこの連携機能を使用しており、直近のコミケでは約2万2000サークルが連携していました。コミケ全体のうち、イラスト・マンガ・小説に関わるサークルのうち、イラスト・マンガ・小説に関わるサークルは約2万7000ほどですので83%になります。

笠原:連携機能を使っているのが83%ということですか?

高橋:そうです。なので、連携機能を使っていない人も含めると、肌感ですがサークルのうち95%くらいはpixivを利用しているのではないかと思います。

では次の「446回」という数字は何でしょうか。これは、これまでの「イラストコンテスト」の開催数です。

笠原:pixivが公式に開催しているイラストコンテストで、基本的にはタイアップ広告という形式で、企業さんのプロモーションのお手伝いとして開催させていただいています。応募テーマや賞金・賞品を設定してコンテストを開催して、多くの人に投稿・拡散してもらいながらプロモーションにもつなげていこうというものです。

実は源流をたどると、最初はユーザーが自発的に始めたものでして。2007年にpixivが始まってからほどなくして「みんなでテーマを決めてお題を出しあってイラストを描こう」というのがユーザー企画として始まりました。

それを受けて、我々も2008年には公式企画として「ピクシブたんを描こう」というのを始めました。「こういうのを描いてね」とテーマを提示しただけなのですが、反響がすごくて。それまで、どういうプロモーション商材の可能性があるかと考えてたんですが、イラストコンテンツが我々の独自商材になるのではということで、販売を開始しました。

具体的にはどのような業種のプロモーションが多いのですか?

笠原:初期はpixivがサブカル系のオタクなサービスというイメージが強かったので、2008年~2009年頃はゲーム会社がほとんどでした。その後はゲーム会社のみならず、出版社、広い意味でのエンタメ業界、飲食などもそうですし、最近ではロート製薬さんなど、業種を選ばずナショナルクライアントと呼ばれる企業にも広がりました。

では次は「2,147,483,647回」……約21億。これは2016年2月時点の累計ブックマーク数です。エンジニアにはピンとくるかもしれませんが、この値は「int変数」の最大値を超えています。

※int変数……プログラミングに用いるint型(整数型)の変数のこと。-21億4748万3648から21億4748万3647までの数字を格納できる

高橋:pixivのアプリ版では、ブックマーク数のカウントにint型を利用していたのですが、この値を超えるとint数という形で数字が数えられなくなるため、ブックマークが数えられなくなってしまいました。

これが生じたのは2月14日だったのですが、この日はバレンタインデーなのですよね。pixivでは、イベントごとに投稿が盛り上がる傾向にありまして、ブックマーク数も普段の20%増になります。それで、バレンタインデーである2月14日に『アプリでブックマークができない』とユーザーからの大量の問い合わせが寄せられることとなり、エンジニアは悲しいチョコをもらうことに・・・。もちろん、すぐにエンジニアが対応しました。ユーザーのみなさんにはご迷惑をおかけして、申し訳なかったです。

次の数字は「17,000,000,000」、約170億。これは広告の月間総imp数(インプレッション=広告の表示回数)です。

笠原:現在1カ月に約170億回、広告を表示しています。広告業界じゃないとピンとこないかと思いますが、国内のアドネットワーク/SSP等の配信広告事業者でも月間数百億imp規模の事業者は少なくないので、1メディアで170億はかなり大きい数字になります。

あまりにも在庫数が大きすぎるので、会社としてビジネスが成長するに当たっては、アドテクノロジーの進化がないと追い付かなかったと思います。170億の配信数を手売りで営業かけても売り切れないので、アドテクノロジー業界の成長にはかなり支えられました。

現在のユーザーの男女比はどうなっていますか?

笠原:最初は男性が多く、しばらく半々だったのですが、現在は女性の方が多いですね。

高橋:PCと比べるとスマホの方が女性の割合がもともと高かったのですが、特に最近では、スマートフォンやアプリのユーザーの伸びが大きくなっています。それによって、女性ユーザーのアクセスが強いメディアに変化していっています。男女によって使い方が違ったりもするのですが、コメントやいいね!などのリアクションの率や数は女性の方が高いですね。

pixivならではのターゲティング広告などはいかがでしょうか?

笠原:女性限定の配信などもできますし、投稿者(pixivに投稿したことがある人)だけにイラストレーターの求人広告を出すといったこともできます。また、タグで絞り込んで配信するというのもやっています。

例えば「おそ松さん」というタグが付いたページにおそ松さん関連の広告を出すと、当たり前ですがめちゃくちゃ反応率が高くなります。しかし、いかんせんpixivも十数万ものタグがあり、1つのタグでは母数となるimp数が少ない。そこで複数のタグをグループ化してターゲティングするというのをやりたいと考えています。

高橋:それは閲覧するときにも活かしたいですね。そのタグを知っていないと検索できないという弱点があるので、ゲームとかでまとまったタグがあればポチポチと進んでいけると考えています。

続いては「19500/26000」という数字です。新卒社員は誰も答えられませんでしたが、これは1日あたりの海外での登録ユーザー数と、総登録者数です。7割以上が海外からということですが、どういう背景なのでしょうか。

高橋:海外からの登録は、アプリの伸びで増えています。2015年くらいから特に伸びているのがグラフに見えています。 また、日本と違って特徴的なのはPCからの登録数も伸びている点です。これは多分海外のネットワーク状況によるものです。海外だと家でWi-Fiを使ってアクセスする。画像サービスなので重めのサービスととらえて、PCで閲覧する層が一定数いるのではないかと思います。

海外ユーザーが多くなると投稿や閲覧の体系も変わるかと思いますが、どのような影響がありますか?

高橋:海外ユーザーが入る方が盛り上がるのではないかと思います。海外ユーザーはコメントやスタンプを日本人以上に積極的に送る傾向があります。絵を描く人からも、評価として匿名でボタンを押されるより「ここがよかった」と言ってもらえる方が嬉しい、という声をもらっています。作品に「よかった」と言ってくれるのはやはり励みになりますから。

今後こういことをしたいというのを発表してもらえますか。

高橋:特にPC、アプリ版の閲覧数を伸ばし、全世界ユーザーに使っていただくサービスにするのが目標です。例えば、現在は英語だと検索しにくいという問題があるので、それをより使いやすくしたいと考えています。

笠原:今後、広告も海外ユーザーには高い精度でローカライズされた海外広告を出すというのを今以上にきっちりとやりたいと思っています。あわせて、ユーザーに向けたカスタマイズもより手をいれていかないといけないと思っています。現在はコンテンツ側のみで「このユーザーはこういう作品が好きだろう」というレコメンドをやっていますが、これは広告とコンテンツで分けて考えるものではありません。「こういうユーザーにはこういう広告がいいだろう」ということを、コンテンツとあわせてカスタマイズするのを、テクノロジーを使ってどう進化させていくかが今後のミッションです。

次回はセッション「エンジニアの働き方 - クリエイターファーストなエンジニアカルチャー」の内容をご紹介します!(※ 近日公開予定)

お絵描きの楽しさを知るための仕掛けをつくる! 「ラクガキ大戦争」ができるまで

こんにちは。 pixiv公式企画を担当している投稿体験チームのnishiokaです。 投稿体験チームでは、オリジナル作品を増やしたり、pixivに楽しんで投稿して貰うための企画を考えています。 今回はpixivで開催している公式企画について紹介します。

pixivでは企業とのタイアップやpixivが公式で開催している企画など、イラストを活用した様々な企画やコンテストを定期的に開催しています。

これまで、pixivの擬人化キャラクターを描いて投稿する「ピクシブたんを描こう!」企画や、ハロウィン、クリスマス、正月などの季節に合わせた企画を運営してきました。

今年からは、これまでのただ投稿するだけの企画ではなく、投稿する以上に何か新鮮な気持ちでお絵描きを楽しめるような仕組みを作ろうということで、企画を進めています。

例えば、pixivでは、1年のうちバレンタインデーの時期は正月に次いで2番目に投稿数が多くなります。そこで、より多くの人が楽しめるようにと「バレンタイン」をテーマとした公式企画を開催しよう!ということになりました。

バレンタインに好きなキャラクターからチョコをもらえる?

テーマは「好きなキャラクターがチョコをプレゼントしている」イラストを投稿するというものです。「好きなキャラクター」と設定することで、誰もが描きたいものを描けるようになり、企画に参加しやすくなるという狙いもあります。

企画中には、イラストを特設ページでブックマークすることで、特殊なエフェクトが表示され「好きなキャラクターからチョコをもらえる」体験ができる仕組みにしました。

また、「最もチョコをもらいたいキャラクター」というテーマで人気投票をした中間発表の際には、pixiv内の流行が反映された、納得と驚きのある内容となり、話題となりました。 [https://twitter.com/pixiv/status/831428790022594562]

今年のバレンタインでは、前年より多くのイラストが集まり、描き手も見る人も、楽しんでいただけたかと思います。 結果はこちら

オリジナル作品を盛り上げたい!

そして、今年5月には次の公式企画を考えることになり、投稿体験チームでは「何をメインに絵を描いてもらい、盛り上げるのか?」を考えました。

そこで注目したのが、クリエイターの知識や経験が詰め込まれている「オリジナル」作品です。 pixivでは、二次創作ではなく、クリエイター自身が独自に創作したオリジナル作品には、「オリジナル」タグをつけることを推奨しています。

この「オリジナル」タグがもっとも投稿作品の中で多く、今年5月には300万作品を超えるほどになりました。

「オリジナル作品が評価されやすい仕組みを作りたい。」
「作品を通じたコミュニケーションをもっと活発化させたい!」
「どうやったら、オリジナルを描く楽しみをもっと知ってもらえるのか?」

これらの想いを中心に、投稿体験チームであれこれ懸命に考えながら生まれたのが、今回の企画”ラクガキの世界をテーマとしたストーリー”を描いた「ラクガキ大戦争」です。

ファンアートがあればお絵描きはもっと楽しくなる

※6月26日に募集期間終了。

オリジナルキャラクター投稿企画「ラクガキ大戦争」とは、「彩度の低い色」「淡い色」「鮮やかな色」の3つのチームに分かれ、イラストに付与される「ブックマーク」の総数で対決する企画です。

参加方法はオリジナルキャラクターを描いて、応援したいチームのタグを付けるだけです。

この企画の1つの大きな特徴として、「相手のチームのラクガキを自分の作風で描きかえる」というルールを作りました。

この「自分の作風で描きかえる」こと、つまり他の人の作品に対し、好きな気持ちを込めて描いたイラストを「ファンアート」と言います。

誰もが一度は、自分の好きな作品のキャラクターを描いたことがあると思います。 ファンアートはそんな「好き」を言葉ではなく、絵を描くことであらわすことができます。

絵を描いて評価をもらうこと、コメントをもらうこと、多くの人に見てもらえること... これらのコミュニケーションだけでも、絵を描く楽しさを一層実感できるものですが、自分の作品が他の人にも描いてもらうという体験もまた、特別な喜びがあります。

今回の企画のルールは、そんなファンアートがたくさん生まれて欲しいという気持ちで作りました。

さらに企画を盛り上げるための仕組みづくりとは

さらに企画を盛り上げるために、企画のルールをもっと分かりやすく、参加しやすくするための機能を入れました。

■ チームバッジ

参加作品にはチームのバッジがつくようにしました。またバッジに企画特設ページへのリンクをつけることで、企画を知らなかった人が気軽に企画概要を知れるようにしました。

■ 「仲間にして」投稿ボタン

バッジの隣に表示されている「仲間にして」投稿ボタンからは、イメージレスポンスや相手チームのタグ付けなどが自動で行われ、簡単に投稿することができるようにしました。

※イメージレスポンス  pixivの投稿作品を関連付ける機能。 ファンアートなどを描いた時に設定すると相手に通知が送信され、承諾されると作品同士のリンクされる。

企画が終了し、その反響は・・・?

「ラクガキ」という誰でも参加できる気軽さが売りとなった本企画は、最終的に1908人のユーザーが参加し、たった2週間で4271件の投稿数が集まりました。過去に開催した公式企画でも投稿数が1000件を超えるものは多くありません。

企画が始まるまでは、楽しんでもらえるかの不安もありましたが、描きかえられたユーザーはお礼や感想を送りあうなどのコミュニケーションが生まれ、たくさんの方にファンアートを楽しんでいただきました。

今回のラクガキ大戦争の結果は?

今回のラクガキ大戦争の結果発表は、下記pixivisionのURLにて見ることができます。 ぜひ作品のエンディングを見届けていただけたら嬉しいです!

https://www.pixivision.net/ja/a/2592

今後も、企画に参加することで絵を楽しく描くことができる...そんなイベントを開催していけたらと思っています。

新しい公式企画第3弾についても楽しめる企画になるよう努めてまいります! 楽しみにしていてください!

YAPC::Fukuokaで懇親会スポンサーとしてやったこと

CTO兼福岡オフィス立ち上げ担当の高山(@edvakf)です。

先月福岡オフィスを立ち上げたばかりなのですが、せっかくなら福岡の技術イベントに行きたい!と思い立ち、YAPC::Fukuokaの懇親会スポンサーをしました。

お恥ずかしながらYAPCに(前)前夜祭から懇親会まで通して参加するのは初めてで、さらに自分自身がカンファレンススポンサー担当になったのも初めての経験だったのですが、なんとか自分なりに満足のいく出来になりましたので、そのまとめを書いていきます。

ランチスポンサーセッション

懇親会スポンサーでは「ランチスポンサーセッション」という10分の枠をいただけました。

スポンサーセッションがどんなものなのかよくわかっていなかったのですが、 自分も聞きたい話 をするべき、と考えて、弊社とさくらインターネットさんで共同開発しているImageFluxの技術の話を@harukasanにしてもらいました。(Perlの話でなかったのは恐縮ですが…)

発表資料はこちらになります。

おかげさまでTwitterでも良い反応をいただけたようです。

もっとたくさん登壇する

スポンサーセッション以外にも、コミュニティの一員としてカンファレンスを盛り上げていきたいと考えました。

実はImageFluxの話やpixiv.netのHTTPS化についての話はトークの応募もしていたのですが、残念ながら落選しまして、トーク0からのスタートでした。(何個もトーク通っているペパボさんやカヤックさんやはてなさんは本当にすごいですね)

YAPCのために福岡出張をする弊社エンジニアたちで頑張って、なんとか6回ほど前に出ることができました。

前前夜祭:『私とHTTPS化とnginx-luaとPerl』(by @catatsuy

@catatsuy本人が詳しく書いてくれましたのでそちらをどうぞ。

YAPC::Fukuoka前々夜祭(非公式)で『私とHTTPS化とnginx-luaとPerl』というタイトルで発表しました&YAPC::Fukuoka参加しました

前夜祭:『Yet Another Pawoo Commit logs』(by @harukasan)

前夜祭のLTでは、弊社のエンジニアが業務として、あるいはプライベートでMastodonにコミットした全コミットログを紹介しました。案の定5分では終わらなかったのは、それだけコミットした証です。

スペシャルセッション:福岡のIT企業のパネルディスカッション(by @edvakf)

写真の左から、ヌーラボの縣さん、スカイディスクの大谷さん、GMOペパボの小田さん、私(筆者)、オンサイトの田中さんというメンバーで話しました。

「東京と比べて福岡のほうが住みやすいのは事実だけど、技術コミュニティがあってエンジニアとしての充実が得られるのは東京なのでは?」みたいな話が非常に印象に残っています。そう言われないためにも福岡の技術コミュニティを盛り上げていかなければ!と思った次第です。

LT:『脆弱性報奨金との付き合い方』(by @edvakf)

自分のLTでは『脆弱性報奨金との付き合い方』を話しました。以前にもブログに書いたことがあるのですが、鮮度が大事なネタでもないですし、多くのYAPC参加者のようなウェブサービスのエンジニアにシェアしたい内容なのでLTに仕立て直しました。

懇親会の乾杯

懇親会ではネタ要素を盛り込んでいこうと思い、みんな大好き(?)AGPLをあしらった YAPC限定Pawooモバイルバッテリー を抽選で配りました。もちろんキャッチコピーもYAPCのために考えました。(そしてpixivFACTORYで作りました

「ツイートしてくれた方から抽選」という手法は以前に@myfinderさんが使っていたのをパクらせていただきました。

最後に

自分が参加者として楽しめる内容にすることを目指して脳内シミュレーションを繰り返して準備した結果、2日間でまんべんなく登壇することができました。忙しい中で協力してくれた@harukasan@catatsuyにはとても感謝しています。

ピクシブではImageFluxエンジニアも、Mastodonエンジニアも、福岡エンジニアも、東京エンジニアも募集しています。

応募はこちらから。

pixivを常時HTTPS化するまでの道のり(後編)

ピクシブ株式会社で開発基盤チームとして働いている @catatsuy です。

前編ではpixivを常時HTTPS化する前にやった前準備として、広告、画像といったリソースをHTTPSに切り替える際の手順を紹介しました。

pixivを常時HTTPS化するまでの道のり(前編) - pixiv inside

後編では実際にpixivのアプリケーション自体を常時HTTPS化していく手順を紹介します。

従来のHTTPS配信

pixivはPHPアプリケーションを実行するアプリケーションサーバー(Apache/mod_php)の前段にnginxを配置する構成になっています。以前からセキュリティ的に重要なページはHTTPSで提供しており、nginxでHTTPS終端処理を行っていました。HTTPSで応答する場合はアプリケーションサーバーにX-HTTPSヘッダーを付けてプロクシーしています。

具体的には以下のようなnginxの設定を使用していました。

HTTPSで提供しているページは一部だけなので、そのページだけをnginxからアプリケーションサーバーに流します。HTTPSで提供しないページはnginxでHTTPのページに302リダイレクトするようにしていました。 セキュリティ的に重要なページはアプリケーション側でX-HTTPSヘッダーの有無を確認して、無ければHTTPSにリダイレクトします。pixivではこの方法でこれまで一部のURLをHTTPSで提供してきました。すべてのURLに対するHTTPS通信をプロキシするようにすることで、常時HTTPSにすることができます。

常時HTTPSへの移行作業

常時HTTPSへの移行手順はざっくり以下のようになります。

  1. Ajaxで叩くAPIを先行してHTTPSに変更する
  2. HTTPとHTTPSの両方で見れるようにする
  3. HTTPへのGETリクエストだけをステータスコード302でHTTPSにリダイレクトする
  4. CSPでmixed contentsの対応漏れがないか探す

1つ1つ説明していきます。

Ajaxで叩くAPIを先行してHTTPSに変更する

ブラウザがリクエストするページに先駆けて、まずAjaxで叩くURLを先行してHTTPSに変更しました。AjaxリクエストではHTTPとHTTPSだけの差でもSame Origin制約に引っかかるのでCORS (Cross-Origin Resource Sharing)を使う必要があります。 弊社では以前からCORSを利用してきました。詳しくは以下、弊社でCORSを導入したときのエントリを参照してください。

CORSでハマったことまとめ - pixiv inside

今回気を付けなければならなかったのはpreflightリクエストです。CORSについて詳しくは以下のURLを参照してください。

HTTP access control (CORS) - HTTP | MDN

POSTリクエストでContent-Typeにapplication/jsonを指定した場合など、CORSでは特定の条件を満たすと実際のリクエストを行う前にpreflightリクエストが行われます。 preflightリクエストはOPTIONSメソッドで行われます。その際Cookieは付与されません。そのためアプリケーション側でOPTIONSメソッドを考慮していない場合、認証が必要なAPIだとログインしていないと判断され、ログインページにリダイレクトするレスポンスを返すなどの想定外の挙動をします。 よって以下のような実装にしました。preflightリクエストでOPTIONSメソッドのリクエストが送られてきたら、アプリケーション側でOriginヘッダーを確認します。想定したOriginヘッダーならば、レスポンスにAccess-Control-Allow-OriginAccess-Control-Allow-Credentialsヘッダーを適切に付けて、ステータスコード200を返します。これで正しく動作しました。

(HTTP access control (CORS) - HTTP | MDN by Mozilla Contributors is licensed under CC-BY-SA 2.5).

HTTPとHTTPSの両方で見れるようにする

次に、すべてのページを本番環境でHTTP、HTTPSの両方でリクエストできるように変更し、ページの動作を確認していきました。

事前の確認として、主要ページがHTTPS上で正しく動作していたら問題なしとしました。理由はpixivはURLが膨大でかつ機能も多いため、最初からすべての機能がHTTPS上で動くかを確認することは困難だからです。 主要な機能がHTTPS上で問題無く動いていたらHTTPS化を行い、後述のCSPでmixed contentsが発生していないか監視を行うという手順で順次HTTPSへ移行しました。

なお、HTTPS化は、ある程度独立して提供されている機能から順次に対応していきました。 たとえば、pixivの小説の機能はwww.pixiv.net/novel/touch.pixiv.net/novel/以下で機能が提供されています。このようにディレクトリが切られて、分割しやすいものから対応していくことで、順次HTTPS化を行えました。

HTTPへのGETリクエストだけをステータスコード302でHTTPSにリダイレクトする

HTTPSにリダイレクトする際に気を付けなければならないことがあります。POSTリクエストをステータスコード302でリダイレクトすると、リダイレクト先にGETリクエストを送ります。その際POSTリクエストで送ったデータは消えてしまいます。

一方で、ステータスコード307でリダイレクトすると多くのブラウザでPOSTメソッドのままPOSTしたデータをリダイレクト先に再送してくれます。しかし、ステータスコード307でPOSTリクエストをリダイレクトした場合、ブラウザ上で確認のダイアログが出ることがあります。ユーザーがPOSTで送ったデータを、他のURLに再送させるのはユーザーに不信感を与えるかもしれません。 以上の理由から、POSTリクエストはリダイレクトしないことが望ましいと考え、今回はPOSTリクエストならリダイレクトしないようにしました。

では、実際にリダイレクトする処理について説明していきます。今回の対応では、www.pixiv.nettouch.pixiv.netでリダイレクトする方法を変えていたので、2つを分けて説明していきます。

touch.pixiv.netの場合

pixivは長い歴史があるサービスであり、ページごとに処理するPHPスクリプトが分かれている構成になっています。例えばプロフィールページのURLは https://www.pixiv.net/member.php?id=11 のようにPHPのファイル名にクエリストリングを渡しているURLです。このため、従来のページ構成では、すべてのページで統一した処理を行うような変更が困難になっていました。

現在pixivではこの問題を解決するためにソースコードの整理を進めており、URLルーティングの導入をすすめています。URLルーティングを用いると、すべてのURLが1つのPHPスクリプトを実行するようになるため、全ページに対して一括した処理を容易に行うことができるようになります。

pixivのURLルーティングについて、詳しくは以下のエントリを参照してください。

PHPで高速に動作するURLルーティングを自作してみた - pixiv inside

HTTPS化の作業を行っていた時点ではtouch.pixiv.netはURLルーターの実装が入っており、アプリケーションの実装から全体を統一的に制御することができるようになっていました。

そこでURLルーターにHTTPSを許可するかどうかのルールを実装し、先程紹介したnginxの設定と同じ挙動をするよう変更しました。 その後nginxの設定を変更し、HTTPSからのリクエストをすべてアプリケーションに流すように修正し、HTTPSの制御をURLルーター側で行うように変更しました。これにより、アプリケーション側でHTTPSの細かい制御が可能になります。

事前に本番環境で確認ができるように、確認用に付与した特定のCookieを持っている場合に、常時HTTPSで見られるようにルーター側の実装を変更しました。

www.pixiv.netの場合

touch.pixiv.netと違い、www.pixiv.netはURLの種類が多く、ルーター化も行われていませんでした。そのためアプリケーション側でHTTPSを許可するかどうかを制御することが困難でした。 そこでアプリケーションのコードを変更せずに、アプリケーション全体の動きを変更するためにnginxで制御を行いました。

nginxで制御を行う場合、以下のデメリットがあります。

  • 開発環境と本番環境の設定を合わせるのが難しい
  • 挙動を確認するためには、nginx設定とアプリケーションコードの両方をみる必要があり、他の開発者がすべての挙動を追うことが難しくなる
  • 特定のCookieを持っていたら動きを変えるといった複雑なロジックを書くにはnginx-luaなどを用いる必要がある

これらのデメリットを解決するのは難しいです。少しでもこれらのデメリットを抑えるために、HTTPとHTTPSが混在する期間を2日に抑えました。 touch.pixiv.netでは1週間混在期間がありましたが、そのために一部の機能が長期間動かないことがありました。 混在期間中は、もっとも動作を保証することが難しいため、混在期間を短く抑えることがおすすめです。

nginxの設定は以下のような設定を書きます。

nginxの設定をこのようにすることでPOSTリクエストのみ許可、GETリクエストはHTTPにリダイレクトする設定が書けます。ただしnginxのifは非常に複雑なので慎重に使う必要があります。

If Is Evil | NGINX

CSPでmixed contentsの対応漏れがないか探す

CSPについて説明します。 CSPとは特定の種類の攻撃を検知したり、実際に影響を軽減させることができるセキュリティ上の仕組みです。指定したURIに対して、ポリシー違反の情報をJSONデータとしてまとめてPOSTすることができます。

詳しくは以下のURLを参照してください。

CSPはHTTPヘッダーを1行返すだけで有効にすることができ、最近のブラウザならばまず対応しています。Report-Onlyにすればユーザーに悪影響はないので安心して付けることができます。 指定方法によってmixed contentsの警告に使えるので、今回のようなHTTPで動いているサービスをHTTPSに移行する際にmixed contentsを見つける用途にも使用することができます。

CSPは以下のような記法で指定していきます。

Content-Security-Policy-Report-Only: default-src https: 'unsafe-inline' 'unsafe-eval'; img-src https: 'unsafe-inline' 'unsafe-eval' data: ; report-uri https://example.com/csp-report

report-uriに指定するURLに制約はありません。POSTメソッドでJSONのデータが送られるだけなので、そのJSONを保存する適当なシステムがあれば容易に確認できるようになります。report-uri.ioという無料のサービスを使うこともできます。大量のリクエストを送ることはできませんが、気軽に始めたいならおすすめです。 ただCSPのレポートが増えたら通知する仕組みなど、工夫を行いたい場合は自社で保存するシステムを用意する必要があるでしょう。

CSPで送られるJSONは以下のようなJSONです。

document-uriにポリシー違反が発生したURLが入ります。この際に気を付けなければならないのはURLのクエリパラメータは消える点です。pixivのURLでは前述の通り https://www.pixiv.net/member.php?id=11のようにクエリパラメータを多く使用しています。 他社のサービスでも検索ページの検索クエリをクエリで渡しているサービスをよく見ます。その場合、特定の検索クエリでmixed contentsが発生していたとしても、https://www.pixiv.net/member.phpのように ? 以降のクエリが報告されないため、その検索クエリが分からない状況になるので注意が必要です。

また広告によってmixed contentsになるケースも検知したいところです。ユーザーにmixed contentsがどの程度発生しているか知りたいというのもありますが、広告の配信設定ミスなどで発生しているケースは早く見つける必要があります。ただし配信広告がiframeを作り、その中で呼ばれた広告タグがHTTPのリソースを呼ぶケースは検知できません。

touch.pixiv.netの場合、ほとんどの広告はtouch.pixiv.net上でscriptタグとして自社の広告配信サーバーを呼び出しています。このケースではtouch.pixiv.net上でCSPのヘッダーを返せばmixed contentsを検知できます。

一方で、www.pixiv.netの場合、ほとんどの広告はiframeで自社の広告配信サーバーのURLを呼び出して、その中で配信広告のタグを呼び出しています。このケースでは自社の広告配信サーバー上でCSPのヘッダーを返せばmixed contentsを検知できます。 ただし自社の広告配信サーバーでは必要な情報はすべてGETクエリに記述されていました。前述の通りCSPのレポートではGETクエリが消えます。そのため、「どの広告枠でmixed contentsが発生しているのか」など、基本的な情報が一切取れなかったため非常に困りました。

配信広告のほかにもブラウザの拡張機能(extension)が依存するアセットでもmixed contentsになります。このケースでもCSPのレポートが送られてきますが、サービスとしてできることは特になく、ノイズが大量に送られてきてしまいます。 つまりmixed contentsを完全に無くすためには拡張機能を作っている各社がすべてHTTPSを使用するようになる必要があるということです。拡張機能によるノイズは直ちに0にすることはできないと割り切り、必要な情報を探し出す必要があるでしょう。

CSPについて説明してきましたが、mixed contentsの対応漏れを発見できるのでとてもよい仕組みです。正直この仕組みがなければ、常時HTTPS化ができると思えませんでした。 不満がないわけではありませんが、有用な情報を取得できる数少ない方法なので確実に使っていくことになるでしょう。

発生した問題

以上で常時HTTPS移行した際の手順を紹介しました。ここから移行時に発生した問題を紹介します。

touch.pixiv.netで起こった問題

Chromeでは、HTTPS上でsetしたlocalStorageはHTTPからはread onlyになります。そのため一部のページがHTTPSに移行した際に、HTTPのページ上で一部機能が正しく動作しない問題がありました。 逆に、HTTPのページ上でsetしたものはHTTPSのページから操作できます。そのため一気にHTTPSに移行してしまえば、問題は解決します。

他にもreferrerを見ていた処理がHTTPでしか提供していなかったため、正しく動作しない問題が発生しました。これではHTTPSでアクセスしたときに、HTTPにリダイレクトをするとreferrerの情報が失われます。 そのため、referrerを見る処理はHTTPとHTTPS両方で使えるようにする必要があります。

referrerについてはReferrer-Policyという仕様があるので紹介します。Referrer-Policyorigin-when-cross-originを使用するとHTTPSからHTTPのリソースを読み込んだり、ページを遷移した場合にオリジンのみ、つまりhttps://example.comのような値だけがreferrerに入ります。

Referrer-Policy - HTTP | MDN

しかしCan I useによると新しい仕様であるorigin-when-cross-originに対応しているのは2017年6月現在ではChromeとFirefoxに限られます。IE/Edge/Safariは対応していません。これらのブラウザに対応していない値であるorigin-when-cross-originを指定するとreferrerの挙動が予想できなくなります。現実的に使用できるのは旧仕様のdefault/never/alwaysの3つに限られるでしょう。

他にも、DBに保存するデータが壊れる問題がありました。pixivの一部処理でpixivのイラストのURLなどが含まれていたら、イラストのIDなどの情報をJSONにしてDBに保存する処理がありました。そのURLの判定処理がHTTP固定になっていたため、HTTPSのURLを貼り付けたときに正しく動作していませんでした。そのためURLの判定ロジックを変更後、該当期間のデータで問題があるものの修正を行いました。

www.pixiv.netで起こった問題

www.pixiv.netは一部のユーザーにだけ設定できる機能が多いため、mixed contentsの対応漏れがいくつか見つかりました。 その内の1つに外部APIをCORSで叩いて、画像URLを取得して表示する処理がありました。その画像URLがHTTPだったためmixed contentsになっていました。この処理はソースコード内をgrepしただけでは見つけることはできないため事前に発見できませんでした。

また前述の通り、pixivの場合GETクエリにはユーザーIDが入っています。CSPのレポートからどのユーザーで発生しているのか見つけることができず、該当処理を発見するのに苦労しました。

しばらく後に発生した問題

移行した直後は問題無かったにも関わらず、しばらく経った後に問題が発生したものがいくつかありました。ここでは2つ紹介します。

当初問題の無かった配信広告がHTTPの画像を読み込むようになったことです。アドネットワークの接続先やさらにその接続先などからHTTPのタグが読み込まれた場合、active mixed contentになるため、そもそも読み込まれません。しかしHTTPの画像は正常に読み込めるため、配信広告事業者側がログなどから気付くことは難しいです。 HTTPSで提供しているサービス上でHTTPの画像を読み込むとpassive mixed contentになり、サービスが安全ではないという表示になります。そのため不利益を被るのはサービスを提供している側、つまりpixivが不利益を被ります。 この問題はサービス提供者側がいち早く気付いて、配信広告事業者側に修正してもらう必要があるため、継続的にCSPのレポートを監視することが重要です。

またSSPやアドエクスチェンジでは、広告の在庫が引き当たらなかった時に呼び出す広告を指定できます。フィラーと呼ばれる設定です。 フィラーとしてHTTPのタグが指定されていましたが、フィラーの設定は在庫がある間はほとんど呼ばれないため、つい見逃しがちです。今回も、常時HTTPS化してしばらく後に顕在化しました。

後戻りできない変更

最後の仕上げとして後戻りできない変更をしていきます。後戻りできない変更は大きく以下の3つです。

  1. ステータスコード301でリダイレクトする
  2. HSTSを返す
  3. Cookieのsecure属性を付ける

1. ステータスコード301でリダイレクトする

今回、最初はステータスコード302のリダイレクトでHTTPSに移行しました。理由はステータスコード301を返してしまうとブラウザ側がキャッシュを持つため、サーバー側にアクセスすることなく移行先のURLにリダイレクトされてしまうからです。HTTPS移行後に致命的な問題が見つかりHTTPSでの配信を一時中断することになったとしても、一度リダイレクトをキャッシュしてしまった利用者がHTTP版のURLにアクセスすることがなくなり、正常にアクセスできなくなってしまう恐れがあります。そのため最初はステータスコード302でリダイレクトを行いました。

それならずっとステータスコード302でいいと考える方もいるかもしれません。しかしステータスコード301でリダイレクトを行わないとGoogle上で表示されるURLが変更されません。 ステータスコード302のリダイレクトはあくまでも一時的なリダイレクトと解釈されるからです。ステータスコード302のリダイレクトでもGoogleのbotはHTTPSの方にアクセスを始めますが、Google上の表示は変更されません。

HTTPSでも問題ないことが確認でき次第、ステータスコード301でリダイレクトするように変更しました。

2. HSTSを返す

ステータスコード301でHTTPからHTTPSにリダイレクトするようにしたら、HSTS(HTTP Strict Transport Security)を必ず返すことをおすすめします。

ステータスコード301でリダイレクトをするようにしても、ユーザーがHTTPのURLにリクエストを送ることがあるからです。それだとHTTPSでアクセスできるにも関わらず、セキュリティレベルが下がってしまいます。 HSTSを返せばブラウザはキャッシュを持ち、そのキャッシュがある間はそのドメインに対して、HTTPSのリクエストしか送らなくなります。HTTPのURLが指定されていたとしても、内部的にHTTPSへリダイレクトを行います。HTTPでリクエストを送りません。

前述の通り、HSTSもユーザーがキャッシュを持つ設定です。一度返してしまうと基本的には戻せません。

3. Cookieのsecure属性を付ける

ここまでやれば、Cookieのsecure属性をつけるべきです。Cookieのsecure属性を付与するとユーザーがHTTPのURLに対してリクエストを送った際にCookieを付与しなくなります。 特にユーザーの認証情報を保持するCookieのsecure属性はつけるべきです。常時HTTPS化が終了した当時は、pixivのCookieを触っているサービスがpixivのみではなかったため、周辺サービスの対応が必要でした。現在では周辺サービスの対応が完了したため、Cookieのsecure属性をつけています。

最後に

ユーザーが安全にサービスを利用できるために、常時HTTPS化は既に必須と言って過言ではありません。pixivのように大きなサービスの場合、様々な人や企業を巻き込まなければ常時HTTPS化は進められません。しかし根気強く進めていけば、不可能なことではありません。

常時HTTPS化により、今後サービス内でWebRTCなどの新しい技術を使って新しい体験をユーザーに提供したり、HTTP2を使って高速な通信を提供したりすることが可能となります。これらについても今後試していきたいと考えています。

今回、前後編にわたって常時HTTPS化を行う際の作業方針、気をつけるべき点、発生した問題を紹介しました。この記事が、今後常時HTTPS化を行う方のお役に立てれば幸いです。

エンジニアを募集中です

ピクシブ株式会社では巨大なシステムを根本から変えていくことに興味があるエンジニアを大募集中です!

pixivがJapan Expo初出展!言語の壁を超えたコミュニケーションで世界へ

こんにちは!
イベント企画や他社との協業プロジェクトを担当しているプランナーのreipyです。

pixivが2017年7月6日から9日にフランスのパリで開催される「Japan Expo(ジャパンエキスポ)」に初出展することが決定しました! Japan Expoとは、2000年より毎年パリで開催されている日本文化を総合的に紹介する見本市で、昨年の来場者数は24万人と世界最大級のイベントです。

昨年のJapan Expoでは、pixiv発のアイドルユニット、虹のコンキスタドールとともにJapan Expo会場内の壁面展示を行いました。 今年は初めてブース出展をするのですが、pixivの紹介とイラストの展示、pixiv人気作家さんのオリジナルグッズ販売を行う予定です。

過去には、pixivは中国の上海や台湾で行われる大規模なマンガ・アニメイベントにて出展したことがあり、そこでは人気作家さんのサイン会やライブペイントを行ったりしています。また、ドイツや台湾のギャラリーで展覧会を開催したりと、定期的に海外ユーザーと直接交流ができる機会をつくっています。

pixivは、なんと海外ユーザーが4割以上!

ところで、pixivにはどのくらいの海外ユーザーがいるか知っていますか? pixivは世界95%以上の国と地域で、2,500万人が利用しており、なんとその約4割が海外のユーザーとなり、その割合は年々増えていっているんです。今では毎日約2万人の新規ユーザー登録があり、そのうち約7割が海外ユーザーとなります。

今回Japan Expoが開催されるフランスのユーザーは約10万人と、ヨーロッパの中では、ドイツとイギリスに並び3番目に多い国となります。 海外全体のユーザー数をみてみると、中国、台湾、韓国、香港、タイ、インドネシアと、アジアの国が多いのが分かります。

海外ユーザーも楽しめる2つの機能

そんなpixivの海外ユーザーも、やはり言語の壁があるとユーザー間のコミュニケーションが取りづらく、基本的な機能を使うことも難しいという問題が出てきます。その問題を解決するために、pixivでは下記2つの機能をつけています。

コメントスタンプ

投稿作品にコメント欄でリアクションとしてスタンプを送ることができる。スタンプの種類は、動物や女の子をモチーフとした4種類37個。

言語設定

メニューバーやヘルプページなどの言語を4か国語(英語・繁体字・簡体字・韓国語)に設定することができる。

ただ上記2つの機能だけでは、日々投稿されている作品のタイトルやキャプション、タグの翻訳はカバーできていません。自動翻訳APIの導入も試してみてはいるのですが、1日あたり26,000枚もの作品が投稿されるpixivではコスト面に置いて現実的ではありません。

そこで、もっと根本的な解決手段として、海外ユーザーでも使いやすいUIの開発に取り組んでいます。

イラスト自体にフォーカスしたUI

グローバルに展開されているPinterest、Instagramなどの海外サービスを見てみると、作品自体にフォーカスされているUIがほとんどで、メインとなるコンテンツをきちんと見やすくすることがいかに大切かということが分かります。 翻訳されていない日本語の広告バナーやタイトル、ユーザー名、キャプションなどは海外ユーザーにとって不要な情報となるため、現在pixivでは、海外ユーザーに対してはそれらの情報を目立たせず、イラスト自体を楽しんでもらえるような設計を検討しています。

また、日本のpixivユーザーの多くの人が利用している検索機能は、海外ユーザーにとっては言語の壁があり、利用しにくい機能の1つです。 そこで、検索機能のハードルを下げるため、”アニメ”や”描き方”のような大きなトピックからキーワードを選択できるカテゴリ機能や、検索ページでテキストで打ち込まずに、より直感的に作品を絞り込めるUIを導入することで、海外のユーザーでも作品を見つけやすくしていきたいとも考えています。

アニメ・漫画・イラストは日本を代表する文化の1つとして、海外からの需要は年々高まっています。今後も、言語に頼らず楽しめるイラストコンテンツの強みを活かした機能追加やUIの改善を行い、世界中の人がストレスなく利用できるようなサービスを目指していきます。

ピクシブでは自分のアイデアで世界中のユーザー、クリエイターを支えたいディレクターを募集しています!pixivが全世界の創作活動のプラットフォームとなるため、熱い気持ちをもって一緒に成長していきたい人をお待ちしています!

pixivを常時HTTPS化するまでの道のり(前編)

ピクシブ株式会社で開発基盤チームとして働いている @catatsuy です。主にpixivの技術的な改善をしていますが、広告チームも兼任しているので広告周りの開発もしています。

今回pixivの常時HTTPS化を担当したのでやったことを紹介します。

pixivをHTTPS化した理由

現在のインターネット全体の流れとして常時HTTPS化が進んでいます。エドワード・スノーデン - Wikipediaが暴露したNSAの事件発覚や 公衆無線LANの利用拡大により、通信経路上でユーザーの個人情報を保護することがインターネット全体として非常に重要になってきました。Googleが行っている調査によると、HTTPSページの閲覧時間はウェブ全体の利用時間の3分の2にも及びます。

それだけではありません。ブラウザに新しく追加されるAPIや機能(HTTP2/WebRTC/ServiceWorkerなど)はHTTPSで使用することが前提となっています。そのためHTTPのままではユーザーに提供できる機能が制限されてしまいます。 また、GoogleはHTTPSページを優先する方針を打ち出しているため、将来的にSEOに影響しかねない点も見逃せません。ブラウザから危険なサイトという表示になるのも時間の問題です。HTTPSでないサイトに対してユーザーが不信感を覚える日もそう遠くはないでしょう。

ピクシブ社内でも2013年にリリースされたBOOTHをはじめとした新規サービスは、リリース当初から常時HTTPSで提供していました。2012年リリースの pixivコミックは途中から常時HTTPSに移行しました。また、pixivコミックの姉妹サービスであるpixivノベルも、最初から常時HTTPSで提供しています。

このように社内でもすでに多くのサービスが常時HTTPSで提供されています。しかしメインサービスであるpixivではログインページなどセキュリティ的に重要な情報を扱うページのみHTTPSで、それ以外のページはすべてHTTPで提供してきました。 これまでいくつかの事情で常時HTTPS化に踏み切れていませんでしたが、それらの事情が払拭されたため常時HTTPS化に踏み切ることができました。

前編では常時HTTPS化に踏み切るに至った背景や、実際に行った作業などを紹介していきます。

HTTPS化に向けてやること

HTTPS化に向けて必要な変更は、ザックリと下記の4点が挙げられます。

  1. 開発環境でHTTPSを利用できるようにする
  2. ページで読み込んでいるすべてのリソースをHTTPSで配信できるようにする
    • 配信広告
    • 静的コンテンツ(CSS、スクリプト、画像など)
    • 画像コンテンツ
    • 自社配信広告
  3. アプリケーションが返すURLをHTTPSに順次切り替える
  4. アプリケーション自体をHTTPSで配信するようにする

HTTPS化というと『URLのhttpをhttpsに置換するだけでは?』と考える方もいるでしょう。アプリケーションのソースコード修正のみを考えればあながち間違いとは言えません。実際それでほぼ完了するサービスも多いでしょう。

しかしpixivのようなコードベースが巨大かつ多くのユーザーを抱えるサービスでは単純な置換のみでは対応できません。今回は具体的にどのような作業をし、どのような問題が起こったのか紹介していきます。

ちなみにpixivの常時HTTPS化は私と当時の新卒エンジニアの2人で担当しました。作業は2017年1月から開始し、touch.pixiv.netは2017年3月21日に完了、www.pixiv.netは2017年4月18日に完了しました。実に4ヶ月に及ぶ戦いでした。 中心となって作業を行ったのは2人でしたが、pixivの常時HTTPS化は会社全体を巻き込んだ大プロジェクトであるため、常時HTTPS化のために多くの社員の力を借りました。全員が常時HTTPS化の必要性を理解しポジティブに協力してくれたことが、大変ありがたかったです。

開発環境の整備

pixivの開発には共用の開発サーバーを利用しています。この環境では、開発者が独立したドメイン名を持った開発環境を、容易に構築できるようになっています。常時HTTPS化の作業よりも前にワイルドカード証明書を導入していたため、既に開発環境でもHTTPSを利用できるようになっていました。

HTTPSで配信できるようにする

配信広告のHTTPS対応

pixivのHTTPS化で一番重要なのは広告タグのHTTPS化でした。実は数年前にもpixivの常時HTTPS化を検討したことはありましたが、当時はHTTPS非対応の広告配信事業者が多く、使用している広告配信事業者が仮に対応していたとしても、その接続先の事業者まで含めると多くの事業者が対応していないという状況があり、断念してきました。 今回の作業時にはほぼすべての事業者がHTTPSでの配信に対応していたため、常時HTTPS化に踏み切ることが出来ました。

弊社の広告は自社で運用している社内広告サーバーから配信しているものと、ソースコード内に直接貼っているものがあります。 社内広告サーバーから配信しているものは、社内の管理画面からHTTPSに対応した広告タグに差し替える必要があります。ソースコード内に直接貼られているものは、広告タグを直接変更してデプロイする必要があります。

またHTTPSでは、HTTPに比べオーバーヘッドがあるため、収益に影響が出る可能性があります。そこで広告の運用を行っているマーケティング部と連携しながら、収益への影響を監視しつつ、広告タグのHTTPSへの差し替えを進めました。

詳しくは後述しますが、一部のアドネットワーク経由でHTTPの広告が配信されたときに、常時HTTPS化によりJavaScriptが実行できずにインプレッション数が減ってしまう問題があります。 それにより一部のインプレッションを落としてしまう問題がありましたが、最終的に収益への大きな影響は見られませんでした。2017年現在では常時HTTPS化ができない理由として配信広告を挙げることは、もはやできないでしょう。

静的コンテンツ配信のHTTPS対応

pixivではHTTPサーバーとしてnginxを様々な用途で使用しています。画像・CSS・JSなどの静的コンテンツも、CDNを利用せずnginxでキャッシュし配信しています。 いずれもnginxでキャッシュを保持し、キャッシュがあるコンテンツについてはすべてキャッシュから配信し、オリジナルサーバーの負荷を下げる構成になっています。

nginxのキャッシュで気を付けるべき点はキャッシュの有無に使用するキーの設定です。httpとhttpsで同じコンテンツを返すサーバーをnginx上で設定しようと考えてみます。 nginxのドキュメントによるとproxy_cache_keyのデフォルトは$scheme$proxy_host$uri$is_args$args;です。$schemeが含まれているためキャッシュのキーにhttphttpsが含まれています。 これだとURLをhttpsに変更したときにキャッシュがないと判断されるため、このままではオリジナルサーバーにアクセスが集中することになります。 httphttpsで同じコンテンツを返すサーバーであれば、proxy_cache_key$schemeは含まない方が良いでしょう。

pixivのサーバーは以上の理由により、常時HTTPS化を行う以前からproxy_cache_key$schemeは含まれていませんでした。そのためURLをHTTPSに変更してもキャッシュが消える心配はありませんでした。 しかしHTTPS化によりユーザーのブラウザ上のキャッシュが使えなくなるため、変えた後しばらくの間、配信サーバーの通信・負荷が増えることは避けられません。 またユーザーのキャッシュを極力活用できるようにするために、完全にランダムでHTTPかHTTPSかを返すよりも、ファイル毎にHTTPSへのURL変更を進めていく方が好ましいでしょう。その方がサーバーの不要な負荷・通信量の削減にもなります。

静的コンテンツ配信サーバーのURLの変更は置換でどんどん行いましたが、pixivの一部のページで以下のような興味深いコードが複数あったので紹介します。

このコードは見覚えのある方が多いかもしれませんが、これはHTML5に対応していないIE8以下のブラウザのために、HTML5で追加されたタグに対応するためのコードです。 既にGoogle Codeは終了しているため有効ではないURLですが、IE8以下でしか実行されないために、動いてないことを気付かれずにそのままになっていました。 pixivでは既にIE8以下はサポートしていないので、これを機に該当するコードをすべて削除しました。 このケースは後編で紹介するCSPで発見できないmixed contentsになるコードなので印象的でした。

画像配信のHTTPS対応

pixivには投稿されたイラストの他に、背景画像・小説のカバー画像・プロフィール画像など実に様々な画像を投稿できます。それぞれが別のコードでURLを組み立てていたためすべてのコードに手を入れる必要がありました。

自社広告配信のHTTPS対応

自社で運用している広告配信サーバーはCPUが強くなかったため、HTTPSによる暗号化の負荷に耐えられませんでした。 加えて、広告配信サーバーはDebian7(wheezy)で構築されていました。既に2017/06中にDebian9(stretch)のリリースが予定されているため、Debian7のサポートは近いうちに止まってしまいます。 このままではセキュリティアップデートもできず、新しいサーバーの構築もできないという状況になります。 しかも移転予定の新しいサーバーでLinuxカーネルのバージョンが古いDebian7を使用すると、不具合が発生することが社内で確認されていました。 そこで今回のサーバー移転を機にDebian8(jessie)への移行を行いました。広告配信サーバーではGoとRubyが使われており、OSに依存した設定が少なかったことで比較的容易に移転することが出来ました。

サーバー移転時に重要なことはx86命令セットの拡張機能であるAES-NIに対応しているかどうか確認することです。 SSLの暗号化・復号化を行うOpenSSLはAES-NIに対応しているため、AES-NIに対応したCPUで動かすことで低いCPU負荷で高速にSSLの暗号化・復号化を行えるようになります。 最近のCPUであればまず対応していますが、BIOSの省電力設定で無効化されていることがあるので注意が必要です。 Linuxではcat /proc/cpuinfoをすると確認できます。本番投入する前に必ず確認しましょう。広告配信サーバーでは事前に問題無いことを確認してから投入を行いました。

HTTPSに順次切り替える

常時HTTPS化にあたって、画像・CSS・JSなど読み込むリソースは例外なくすべてHTTPSに変更する必要があります。配信広告以外をどう書き換えるべきか紹介します。

Mixed contentsについて

mixed contentsについて紹介します。詳しくは以下のURLを参照してください。

混合コンテンツとは | Web | Google Developers

簡単に解説すると、mixed contentsはHTTPSのサイト上でHTTPのリソースを読み込んだ時に発生します。折角ページをHTTPSにしても、HTTPのリソースを1つでも読み込んでしまうとセキュリティレベルが低下します。ブラウザ上の表示も変わりユーザーに不信感を与えてしまうため、できる限りなくすことが非常に重要です。

mixed contentsには2種類あります。Passive mixed contentとActive mixed contentです。

Passive mixed contentはHTTPSのページの中でHTTPの画像などを読み込んだ時に発生します。ブラウザにより表示は異なりますが、多くの場合このケースでは画像自体は読み込まれます。しかしHTTPSなら安全なサイトであるという表示になるはずですが、その表示がなくなって安全ではないサイトという表示になります。

passive mixed content

気を付けなければならないのは、pixivでは一部の画像にreferrer制限をかけています。HTTPSからHTTPへはreferrerが送られません。referrer制限がかかっているHTTPの画像をHTTPS上で読み込んだ場合、mixed contentsになり、かつ画像が表示されないという状況になります。イラストSNSとして致命的な状況にもなり得るので絶対に避けなければなりません。

Active mixed contentはHTTPSのページの中でHTTPのJavaScriptやCSSやiframeなどを読み込んだ時に発生します。 Active mixed contentの場合、コードは実行されません。ブラウザにより表示は異なりますが、赤い×などが表示され、ユーザーから見るとセキュリティ的に問題のあるサイトという表示になります。

active mixed content

HTTPSの配信広告タグを使用しているにも関わらず、アドネットワーク経由でHTTPの広告タグが読み込まれることがあります。その場合Active mixed contentになるため、コードは実行されず、インプレッション数がその分減ってしまいます。

少しややこしいですが、Passive mixed contentとActive mixed contentには細かい挙動の違いがあるのでHTTPS化をやる場合はしっかり覚えておきましょう。

HTTPSとフィーチャーフォン

mixed contentsを撲滅するために、どんどんソースコードを書き換えていきます。その前にpixivのフィーチャーフォン版について言及します。

pixivはpixiv.gitというリポジトリで管理されています。pixiv.gitではpixiv-libと呼ばれる共通ライブラリを使用しています。画像のURL生成ロジックなどはそのpixiv-libが担当しています。 pixivは小説のみ、フィーチャーフォン版(m.pixiv.net)が存在しています。フィーチャーフォンでは端末に内蔵されているルート証明書が一般的なPCやスマートフォンよりも少なかったり、SHA256の証明書に対応していなかったりします。 既にセキュリティ的に脆弱であることが分かっているSHA-1の証明書を発行する手段はありませんし、pixivもSHA256の証明書にしか対応していません。 現在では新しいフィーチャーフォンを入手することも難しいため、今もフィーチャーフォンを使っているユーザーは非常に古い端末を使い続けている可能性があります。 そのためフィーチャーフォンで使用されている画像URLなどをHTTPSに書き換えると動作しなくなる端末があるでしょう。そのためpixiv-lib側で安易にすべてのURLをHTTPSに変更しないようにする必要がありました。

また以上の理由からフィーチャーフォン版をHTTPS化する予定はありません。

DBに保存されている画像URL変更

pixivのお知らせなどで画像を貼ることがよくあります。そういった社内でアップローダーとして使われてきたURLのHTTPS化を行う必要がありました。 これらのお知らせはデータベース上にURLがそのまま保存されていました。データベースのレコード数はそこまで多くなかったので、URLをHTTPSでも読み込めるように変更した上で、SQLのLIKE演算子を使用して抜け漏れがないか探しながら、MySQLのREPLACE文を打つことでURLの一斉置換を行いました。

また今後追加されるお知らせもHTTPSで配信されるように、管理画面上に表示されるURLをHTTPSに変更するなどの対応も行いました。

広告ロジックの修正

これまでpixivではセキュリティ的に重要なページのみがHTTPSで、それ以外はすべてHTTPで提供してきました。そのため昔からHTTPSが使用されているページ(ログイン・パスワード変更など)はセキュリティ的に重要なページのため、これまで外部のスクリプトは読み込まないポリシーでした。 そのことを利用してHTTPSならば広告を非表示にする、というロジックがpixivのコード内に存在していました。以前はそれで十分でしたが、これからHTTPS化を行うに辺り、広告が出るべきページで広告が出ないという問題が発生します。 そこでpixiv側の実装を見直し、ログインページなどセキュリティ的に重要なページは外部JS実行不可ページリスト、コンテストやpixivFANBOXなど広告を表示するべきでないページを広告非表示ページリストとしてそれぞれ保持し、HTTPSかどうかには依存しないロジックに変更しました。

他社のスクリプトの読み込み

pixivは配信広告以外にも多くの他社のスクリプトに依存しています。Google Analyticsを読み込んでいないWebサービスはほとんどないでしょう。TwitterやFacebookなどSNSのシェアボタンもあります。 それらの読み込んでいるスクリプトがすべてHTTPSに対応しているわけではありません。

pixivは中国のユーザーも多く抱えるサービスです。しかし中国のサービスはHTTPSに対応していないことが多く、シェアボタンもHTTPSに対応していないサービスがありました。 たまたまでしたが、SNSボタンのUIを統一するためにSNSのシェアボタンをリンクにする話が社内で進行していたため、その時にリンクにして外部のスクリプトの依存を外す対応をしました。

他にもHTTPSに対応していない動画サービスの埋め込みを利用している箇所があったため、リンクにしたり、どうしても埋め込みたい場合はHTTPSに対応しているYouTubeにアップロードし直すことで対応できました。

前編まとめ

今まで長々と書いてきましたが、ここまではすべてpixivをHTTPS化するための前準備にすぎません。後編で実際にpixivをどうHTTPS化したか、どういうトラブルが起こったのかを紹介していきます。

また2017年6月21日に弊社オフィスで大規模HTTPS導入Nightを開催いたします。このエントリーの内容に興味のある方におすすめです。

HTTPS化についてヤフー・クックパッド・ピクシブが語る! - 大規模HTTPS導入Night - connpass

福岡中継! HTTPS化についてヤフー・クックパッド・ピクシブが語る!大規模HTTPS導入Night - connpass

後編はこちら

https://inside.pixiv.blog/catatsuy/1872