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
850
GraphQLを安全に使うためにやっていること
「テックリードの悩みを解決するGraphQLの話」にて弊社エンジニア重本が登壇した資料です。
https://estie.connpass.com/event/328999/
林憲吾
September 20, 2024
Tweet
Share
More Decks by 林憲吾
See All by 林憲吾
GraphQLでの型渡しとデータフェッチの最適化
hayashikengo
1
560
電子署名サービスの品質戦略
hayashikengo
1
980
CTOの役割と、カルチャーの醸成
hayashikengo
1
95
Other Decks in Technology
See All in Technology
Oracle Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
3
970
Introduction to Bill One Development Engineer
sansan33
PRO
0
350
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
340
「全社導入」は結果。1人の熱狂が組織に伝播したmikanのn8n活用
sota_mikami
0
250
Kaggleコンペティション「MABe Challenge - Social Action Recognition in Mice」振り返り
yu4u
1
650
Bill One 開発エンジニア 紹介資料
sansan33
PRO
4
17k
Proxmoxで作る自宅クラウド入門
koinunopochi
0
170
BPaaSオペレーション・kubell社内 n8n活用による効率化検証事例紹介
kentarofujii
0
180
SOC2は、取った瞬間よりその後が面白い
3flower
0
140
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.9k
Databricks Free Editionで始めるLakeflow SDP
taka_aki
0
170
ソフトとハード両方いけるデータ人材の育て方
waiwai2111
1
540
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
The Invisible Side of Design
smashingmag
302
51k
Prompt Engineering for Job Search
mfonobong
0
140
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.2k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
The Cost Of JavaScript in 2023
addyosmani
55
9.4k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
270
sira's awesome portfolio website redesign presentation
elsirapls
0
120
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
115
100k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Technical Leadership for Architectural Decision Making
baasie
1
220
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