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
790
GraphQLを安全に使うためにやっていること
「テックリードの悩みを解決するGraphQLの話」にて弊社エンジニア重本が登壇した資料です。
https://estie.connpass.com/event/328999/
林憲吾
September 20, 2024
Tweet
Share
More Decks by 林憲吾
See All by 林憲吾
GraphQLでの型渡しとデータフェッチの最適化
hayashikengo
1
520
電子署名サービスの品質戦略
hayashikengo
1
920
CTOの役割と、カルチャーの醸成
hayashikengo
1
89
Other Decks in Technology
See All in Technology
AI駆動開発を推進するためにサービス開発チームで 取り組んでいること
noayaoshiro
0
200
ユニットテストに対する考え方の変遷 / Everyone should watch his live coding
mdstoy
0
130
SREとソフトウェア開発者の合同チームはどのようにS3のコストを削減したか?
muziyoshiz
1
100
動画データのポテンシャルを引き出す! Databricks と AI活用への奮闘記(現在進行形)
databricksjapan
0
150
業務自動化プラットフォーム Google Agentspace に入門してみる #devio2025
maroon1st
0
190
成長自己責任時代のあるきかた/How to navigate the era of personal responsibility for growth
kwappa
3
280
実装で解き明かす並行処理の歴史
zozotech
PRO
1
480
多様な事業ドメインのクリエイターへ 価値を届けるための営みについて
massyuu
1
370
KMP の Swift export
kokihirokawa
0
340
いまさら聞けない ABテスト入門
skmr2348
1
210
Why React!?? Next.jsそしてReactを改めてイチから選ぶ
ypresto
10
4.5k
How to achieve interoperable digital identity across Asian countries
fujie
0
120
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.6k
The Power of CSS Pseudo Elements
geoffreycrofte
79
6k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Faster Mobile Websites
deanohume
310
31k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Facilitating Awesome Meetings
lara
56
6.6k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.6k
Producing Creativity
orderedlist
PRO
347
40k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
Fireside Chat
paigeccino
40
3.7k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
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