Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GraphQLを安全に使うためにやっていること
Search
林憲吾
September 20, 2024
Technology
2
870
GraphQLを安全に使うためにやっていること
「テックリードの悩みを解決するGraphQLの話」にて弊社エンジニア重本が登壇した資料です。
https://estie.connpass.com/event/328999/
林憲吾
September 20, 2024
Tweet
Share
More Decks by 林憲吾
See All by 林憲吾
GraphQLでの型渡しとデータフェッチの最適化
hayashikengo
1
570
電子署名サービスの品質戦略
hayashikengo
1
1k
CTOの役割と、カルチャーの醸成
hayashikengo
1
98
Other Decks in Technology
See All in Technology
社内ワークショップで終わらせない 業務改善AIエージェント開発
lycorptech_jp
PRO
1
450
大規模な組織におけるAI Agent活用の促進と課題
lycorptech_jp
PRO
5
7.7k
OCI技術資料 : 外部接続 VPN接続 詳細
ocise
1
10k
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3k
Snowflake Night #2 LT
taromatsui_cccmkhd
0
320
AI Agentにおける評価指標とAgent GPA
tsho
1
280
オンプレとGoogle Cloudを安全に繋ぐための、セキュア通信の勘所
waiwai2111
3
1.1k
WBCの解説は生成AIにやらせよう - 生成AIで野球解説者AI Agentを実現する / Baseball Commentator AI Agent for Gemini
shinyorke
PRO
0
320
ソフトウェアアーキテクトのための意思決定術: Create Decision Readiness—The Real Skill Behind Architectural Decision
snoozer05
PRO
27
8.4k
LINEアプリ開発のための Claude Code活用基盤の構築
lycorptech_jp
PRO
1
1.3k
チームメンバー迷わないIaC設計
hayama17
5
3.6k
パネルディスカッション資料 (at Tableau Now! - 2026-02-26)
yoshitakaarakawa
0
1k
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
304
21k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1k
Evolving SEO for Evolving Search Engines
ryanjones
0
150
BBQ
matthewcrist
89
10k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
280
How to make the Groovebox
asonas
2
2k
Amusing Abliteration
ianozsvald
0
120
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
950
エンジニアに許された特別な時間の終わり
watany
106
240k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
190
Done Done
chrislema
186
16k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Transcript
GraphQLを安全に使うためにやっていること 株式会社PICK 重本 太宏
重本 太宏 / Takahiro Shigemoto 自己紹介 Web Engineer at PICK
BE : FE = 7 : 3 設計が好き お気に入りはオニオンアーキ × DDD × テスト駆動
GraphQLの利点 利便性がもたらすリスク 01. PICKで行っている対策 02. 03. 目次 まとめ 04.
01. GraphQLの利点
GraphQLの利点 01. GraphQLの利点 • いちいちエンドポイントを考える必要がない。増えない。 • 型でFEとBEが語り合える • FEでレスポンスを型安全に扱うことができる •
一つのクエリで様々なデータフェッチに対応することができる • オーバーフェッチを考慮しなくていいので、 API実装側はYAGNIをあまり気 にせず実装可能
GraphQLの柔軟性の理由 01. GraphQLの利点 A. GraphQLは「型というノードがグラフで繋がれた世界にアクセスするためのク エリ言語」 だから • SQLに近い •
リレーションさえしていれば(エッジで繋がってさえいれば)縦横無尽にフィール ドを取得することができる
01. GraphQLの柔軟性の理由 GraphQLの利点 Compa ny Team Contrac t User
02. 利便性がもたらすリスク
利便性がもたらすリスク 02. 利便性がもたらすリスク • どこからでも引っ張ってこれることによる、意図しないフィールド露出 • 複雑なクエリや深いクエリを呼ばれることによる DoS攻撃リスク 取ろうと思えばフィールドを取れすぎるのが元凶
03. PICKで行っている対策
フィールド露出対策 03. PICKで行っている対策 • 敢えて有向グラフにする • フィールドに認可機能を入れる
フィールド露出対策 03. PICKで行っている対策 あえて有向グラフにする • 有向にすることで意図しないフィールド露出を抑制できる • メリット • 簡単にできる
• デメリット • 利便性が下がる • 把握が難しい Compa ny Team Contrac t User
フィールド露出対策 03. PICKで行っている対策 フィールドに認可機能を入れる • NestJSが提供している FieldMiddlewareを利用 • フィールドを解決する前後に処理を追加してくれる機能を利用する •
PICKではResolver関数の認可を Guardで行い、フィールドの認可を FieldMiddlewareで行って いる
フィールド露出対策 03. PICKで行っている対策 フィールドに認可機能を入れる 1. Resolverの引数に入る Contextに必要な情報を入れる 2. FieldMiddlewareを定義する 3.
フィールドに適用する
フィールド露出対策 03. PICKで行っている対策
DoS攻撃対策 03. PICKで行っている対策 • 同時にいくつものクエリを叩ける • 深く取得しようと思えばいくらでもいける GraphQLはQueryによってサーバーに過剰なストレスを与えることができる
DoS攻撃対策 03. PICKで行っている対策 • Apollo-serverのvalidationRulesオプションを利用し、同時に叩ける Query数を制 限 • GraphQL Depth
Limitを導入し、深さを制限 ならばクエリの数と深さを制限すればいいじゃない
Dos攻撃対策 03. PICKで行っている対策 同時に叩けるクエリ数を制限 graphql-jsパッケージに含まれる validationContextクラ スを使用。 (Queryがパースされた ASTが入っている)
Dos攻撃対策 03. PICKで行っている対策 深さを制限 GraphQL Depth Limitを導入
04. まとめ
まとめ 04. まとめ • GraphQLはフィールドを縦横無尽に取得できて超便利 • 型がグラフでつながり合った世界にアクセスする仕組みだから • その利便性ゆえに起こる問題 •
どこからでも引っ張ってこれることによる、意図しないフィールド露出 • あえて有向グラフにする • resolver関数だけでなくフィールドにも認可を機能をつける • 複雑なクエリや深いクエリを呼ばれることによる DoS攻撃リスク • 同時に叩ける Query数を制限する • 深さを制限する この2つはかなり手軽に導入できるのでおすすめ
今後の課題 04. まとめ • クエリの複雑度分析を取り入れていきたい • IntrospectionやAlias等をOFFにすることの検討 • CQRSとか考慮したい
ご清聴ありがとうございました
None