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
650
GraphQLを安全に使うためにやっていること
「テックリードの悩みを解決するGraphQLの話」にて弊社エンジニア重本が登壇した資料です。
https://estie.connpass.com/event/328999/
林憲吾
September 20, 2024
Tweet
Share
More Decks by 林憲吾
See All by 林憲吾
GraphQLでの型渡しとデータフェッチの最適化
hayashikengo
1
430
電子署名サービスの品質戦略
hayashikengo
1
780
CTOの役割と、カルチャーの醸成
hayashikengo
1
78
Other Decks in Technology
See All in Technology
IAMのマニアックな話 2025 ~40分バージョン ~
nrinetcom
PRO
8
920
サーバシステムを無理なくコンテナ移行する際に伝えたい4つのポイント/Container_Happy_Migration_Method
ozawa
1
100
「ラベルにとらわれない」エンジニアでいること/Be an engineer beyond labels
kaonavi
0
130
ウェブアクセシビリティとは
lycorptech_jp
PRO
0
260
Amazon EKS Auto ModeでKubernetesの運用をシンプルにする
sshota0809
0
110
KCD Brazil '25: Enabling Developers with Dapr & Backstage
salaboy
1
120
非エンジニアにも伝えるメールセキュリティ / Email security for non-engineers
ykanoh
13
3.9k
頻繁リリース × 高品質 = 無理ゲー? いや、できます!/20250306 Shoki Hyo
shift_evolve
0
150
ペアプログラミングにQAが加わった!職能を超えたモブプログラミングの事例と学び
tonionagauzzi
1
140
Compose MultiplatformにおけるiOSネイティブ実装のベストプラクティス
enomotok
1
210
LINE Notify互換のボットを作った話
kenichirokimura
0
180
Multitenant 23ai の全貌 - 機能・設計・実装・運用からマイクロサービスまで
oracle4engineer
PRO
2
120
Featured
See All Featured
Speed Design
sergeychernyshev
28
860
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
177
52k
Side Projects
sachag
452
42k
Site-Speed That Sticks
csswizardry
4
450
Building a Modern Day E-commerce SEO Strategy
aleyda
39
7.2k
4 Signs Your Business is Dying
shpigford
183
22k
Code Reviewing Like a Champion
maltzj
522
39k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
12
610
Why Our Code Smells
bkeepers
PRO
336
57k
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