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
990
CTOの役割と、カルチャーの醸成
hayashikengo
1
95
Other Decks in Technology
See All in Technology
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
93k
M&A 後の統合をどう進めるか ─ ナレッジワーク × Poetics が実践した組織とシステムの融合
kworkdev
PRO
1
480
30万人の同時アクセスに耐えたい!新サービスの盤石なリリースを支える負荷試験 / SRE Kaigi 2026
genda
4
1.3k
コスト削減から「セキュリティと利便性」を担うプラットフォームへ
sansantech
PRO
3
1.6k
セキュリティについて学ぶ会 / 2026 01 25 Takamatsu WordPress Meetup
rocketmartue
1
310
GitHub Issue Templates + Coding Agentで簡単みんなでIaC/Easy IaC for Everyone with GitHub Issue Templates + Coding Agent
aeonpeople
1
250
ブロックテーマ、WordPress でウェブサイトをつくるということ / 2026.02.07 Gifu WordPress Meetup
torounit
0
190
20260204_Midosuji_Tech
takuyay0ne
1
160
Codex 5.3 と Opus 4.6 にコーポレートサイトを作らせてみた / Codex 5.3 vs Opus 4.6
ama_ch
0
190
Kiro IDEのドキュメントを全部読んだので地味だけどちょっと嬉しい機能を紹介する
khmoryz
0
210
プロポーザルに込める段取り八分
shoheimitani
1
570
usermode linux without MMU - fosdem2026 kernel devroom
thehajime
0
240
Featured
See All Featured
Tell your own story through comics
letsgokoyo
1
810
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
190
How Software Deployment tools have changed in the past 20 years
geshan
0
32k
Ethics towards AI in product and experience design
skipperchong
2
200
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
52
Faster Mobile Websites
deanohume
310
31k
Prompt Engineering for Job Search
mfonobong
0
160
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
61
52k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.8k
The Cult of Friendly URLs
andyhume
79
6.8k
Into the Great Unknown - MozCon
thekraken
40
2.3k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
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