はじめに
こんにちは。uchijoと申します。 この夏、GMOペパボ株式会社の2024年度 サマーインターンに参加いたしました。 その振り返りも兼ねて、やったことや得られた学びなどをまとめようと思います。
インターンシップ概要
今回のインターンシップで私が配属されたのは、ホスティング事業部の for Gamers チームです。 このチームでは、ゲームのマルチプレイ時に利用するサーバーのホスティングに特化した「ロリポップ for Gamers」を開発しています。
インターンの業務では、他の3人のインターン生と一緒に1つのタスクに取り組みました。 期間は7月29日(月)から8月9日(金)までの2週間です。 ほぼ全て対面での参加となり、チームメンバーやパートナーの方々とのコミュニケーションも非常にスムーズに進められました。
インターンの選考は、まず4月末にエントリーシートを提出し、6月上旬ごろに面接という流れでした。 6月半ばに合否の連絡があり、かなり早い段階で参加が決定しました。 なお、2024年はこのようなスケジュールでしたが、来年も同様のスケジュールとは限りません。 興味のある方は随時最新情報を確認することをおすすめします。
インターンシップに参加した理由
会社・事業への興味
今回インターンシップに参加した理由の一つは、GMOペパボの事業内容や職場環境に対する興味です。 IaaSやPaaSといったインターネットインフラに関連する事業に以前から関心があり、その中でもホスティング事業やドメインレジストラなども手掛けるGMOペパボに特に魅力を感じていました。
また、Webサービスの開発現場がどのように機能しているのかを知りたいという思いもありました。 これまで外から見ていたWeb系の企業が、日々どのように業務を進めているのかを実際に見てみたいという強い興味が、インターン参加の大きな動機となりました。
大きなプロダクトの開発を学ぶ
さらに、個人開発では経験できない大規模なプロダクト開発に触れることで、技術的に成長することを目指していました。 特に、アーキテクチャ設計のベストプラクティスや、大規模なコードベースとの向き合い方に関心があり、これを現場で実際に触れることで学びたいと考えていました。
また、チーム開発の進め方やタスク管理の方法を学ぶことも、重要な目的の一つでした。 具体的には、朝会やスクラムといった手法が、実際にどのようにプロジェクトの中で運用されているのかを知りたいと考えていました。 個人や学生開発では経験できない、実際のチーム開発の運営方法を吸収したいという思いが強くありました。
取り組んだタスク
GMOペパボのインターンシップでは、実際のプロダクトに触れて課題解決に取り組むことができる点が大きな特徴です。 今回も、プロダクトが抱える具体的な課題に対して、インターン生として直接関わることができました。 課題や大まかな方針がプロジェクトチームから提示され、その解決に向けた作業を進めていくという形でタスクに取り組んでいきました。
プロダクトの抱える課題
今回取り組んだタスクは、アカウント登録フローの改善です。 もともとの登録フローでは、ユーザがメールアドレスを入力すると、そのメールに確認用リンクが送信されます。 このリンクを開くことで、登録が完了するというのが一連の流れでした。 なお、セキュリティ上の懸念から、メールアドレスを入力した人が本当にそのメールアドレスの所有者であることを担保する必要があります。 そのため、メールアドレスを入力した際と同じデバイス・同じブラウザ以外でメール記載のリンクが開かれた場合、他人によるメールアドレス入力があったとみなし、エラーとしていました。
ここで問題となったのが、この「メールアドレスを入力したものと同じデバイス・ブラウザ」という条件がユーザから見てわかりづらいという点です。 例えばPCでメールアドレスを入力した後でスマホからメールのリンクを開いても登録エラーとなってしまうなど、とても直感的とは言い難く、スムーズなユーザ体験を大きく阻害することは容易に想像できます。 また、これが発生しているのがアカウントの登録フローであるというのも大きな問題です。 せっかく登録しようと思ったユーザが離脱してしまう原因になりうるため、このプロダクトの大きな課題といえます。 これを解決するため、登録フローの改善が必要でした。
解決の方針
この課題を解決するため、アカウント登録フロー自体を変更し、従来のメールリンクによる方式から認証コード方式に移行することになりました。 認証コード方式では、ユーザーにメールで認証コードを送付し、それを入力することで登録を完了させます。 これにより、意図せずに使用していたブラウザを変更してしまうことを防ぐことができるようになり、「メールアドレスを入力したものと同じデバイス・ブラウザを使う」という条件を満たしたまま、より分かりやすいフローをユーザに提供できます。
実際の作業
最初に与えられたタスクは、当時のメールと一時リンクを使った登録フローのままで、登録・ログインに関するブルートフォース攻撃への対策を行うことでした。 登録フロー変更前では、確認のために使用される認証情報は十分長く、現実的な時間での総当たりは不可能と判断されていました。 しかし、一般的な認証コードは長くても8桁程度である事例が多く、これではブルートフォース攻撃に対してやや不安が残ります。 将来的に認証コード方式へ移行することを見据え、この段階でセキュリティを強化しておく必要がありました。
作業は、実際のコーディングに加え、DB設計やUI/UXの検討も並行して進めました。 デザイナーさんと協力しながら、画面の表示や使い勝手についても調整しつつ、全体的な実装作業に取り組みました。 特に印象に残っているのはDB上でどのようにログイン試行回数を持つかという点の検討です。 一貫性を重視する方針と効率を重視する方針があったのですが、現状パフォーマンス的な問題が発生していないという点も加味して、一貫性を重視する設計を選びました。 ブルートフォース対策のタスク自体は順調に進み、インターン期間の半分ほどで完了しました。
そのため後半からは、追加タスクとして認証コード方式への移行に取り掛かりました。 しかし、作業を進める中で、チームメンバーの一人が、このままではブルートフォース攻撃を完全に防げない重要な問題に気付きました。 具体的には、登録確認メールのレートリミットを設けていないため、試行回数の制限に引っかかるたびにメール送信からやりなおすことで、結局は現実的な時間でのブルートフォース攻撃ができてしまうという問題です。 これまでの実装では、認証に使用するトークンの長さが十分に長かったため、上記の方法でブルートフォース攻撃を受けても、現実的な時間では突破は不可能と評価されていました。 しかし、今回の仕様変更で認証コードの長さが短くなったため、以前では問題とならないこのようなケースも考慮する必要が出てきたというわけです。 この発見がなければ、潜在的なリスクが残るところでしたが、早い段階で気付くことができたため、すぐに対応に取り掛かることができました。
この問題への解決策として、Cloudflare Turnstileを導入することが決まりました。 Cloudflare Turnstileは、CAPTCHAのような仕組みで、ブルートフォース攻撃を効果的に防ぐための対策として非常に有効です。 今回のケースでは、登録の確認メールが何度も大量に送れてしまうことが問題でした。 Turnstileの導入により、同じ経路からの怪しいフォーム入力が適切に弾かれるようになるため、攻撃を目的とした確認メールの再試行を防ぐことができます。 認証コードへの移行と並行して、フロントエンドとバックエンドの両方でTurnstileの導入を進めていきました。
結果
結果として、チーム全体で大部分のタスクを無事に実装することができました。 特に、最初のゴールだった「現行の登録フローでブルートフォース攻撃を防げるようにする」というタスクを早めに終え、追加タスクにも取り組めたことは、非常に嬉しいポイントでした。 チームメイトが皆優秀で、それぞれのスキルを活かしながらスムーズに進めることができ、本当に心強かったです。
一方、Cloudflare Turnstileの導入については、時間的な制約があり、インターン終了までに全て完了することはできませんでした。 最終的に、Turnstileの導入部分は引き継ぐ形となり、インターンを終えることとなりました。 終わらなかった部分があったのは残念でしたが、それでも全体としては非常に充実した経験を得ることができました。
また、パートナーの皆さんからのサポートも大変ありがたく感じました。 特に、技術的なアドバイスや適切なフィードバックをいただけたことで、スムーズに作業を進めることができました。 パートナーの方々の協力なしには、この成果を達成することは難しかったように思います。
会社のよかったところ
開発に関わる部分
まず最初にお伝えしたいのは、開発をする際の環境の良さです。 今回のインターンで「約束の地」を見たような感覚がありました。
実際に業務を進める中で、CI/CDをはじめとする開発をサポートする仕組みがしっかりと整備されていると感じました。 中でも特に印象に残っているのは、プルリクエストでコマンドを実行するとプレビュー環境が自動的に立ち上がる機能です。 動作確認のために実際にこの機能を使用する機会がありましたが、複雑な手順を踏むことなく、本番に近い環境での動作確認ができ、とても便利でした。
さらに、コード品質へのこだわりも印象的でした。 たとえばある日の朝会では、突発的に命名に関する議論が行われ、非常に細かい部分までこだわって一貫性を保つ姿勢が見られました。
こうした環境の中での開発は非常に快適で、実際に作業をしていても難解なコードや煩雑なルールに悩まされることはほとんどありませんでした。 今後開発をしていく際に目指すべき理想像を知ることができたと感じています。
福利厚生
会社の福利厚生はとにかく充実していました。 社内にカフェがあり、タンブラーを持参すれば飲み物が飲み放題で、実際にインターンシップ期間中も何度も利用しました。 パンなどの軽食もあり、作業に疲れたときにリフレッシュするのに最適でした。 また、実際利用する機会はなかったのですが、ジムや昼寝ができる設備まで完備されているうえ、なんと毎週金曜日にはお酒と軽食を楽しめる会も開催されるそうで、とても驚きました。
立地
地味ながら見逃せないのが立地の良さです。 オフィスは渋谷のセルリアンタワーにあるのですが、渋谷駅新南口が完成したこともあり、駅までの距離は短く通勤しやすかったです。 また、周囲にはたくさん美味しい料理屋があり、インターンシップ期間中もいくつかのお店に連れて行ってもらいました。
最後に
優秀な同世代の人たちと一緒に働けたことで、たくさんの刺激を受け、勉強へのモチベーションも高まりました。 多くのことを学び、成長できたと感じています。
自分が実際に手を加えた部分がプロダクトに組み込まれ、動いているのを見られたのも非常に嬉しかったです。 後日、自分たちが担当した機能がリリースされた際には、思わず自分でもサービスに登録してみたほどです。
また、パートナーの皆さんが常にサポートしていただいたおかげで、円滑に作業を進めることができました。 特に、エンジニアのdonokun さん、yukyanさん、nacalさんには大変お世話になり、感謝の気持ちでいっぱいです。
本当にありがとうございました。