Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RailsアプリにGraphQLを導入してみた話

patorash
November 30, 2019

 RailsアプリにGraphQLを導入してみた話

会社で運用しているWebサービスにGraphQLを導入してみたので、その際に得られた知見を共有します。

patorash

November 30, 2019
Tweet

More Decks by patorash

Other Decks in Programming

Transcript

  1. ໨࣍  ࣗݾ঺հ  3&45GVM"1*ͷ՝୊  (SBQI2-ͱ͸ʁ  σϞ 

    ։ൃͯ͠Έͯͷײ૝ B ϝϦοτ C σϝϦοτ D ޻෉ͨ͠ͱ͜Ζ E ϋϚͬͨϙΠϯτ  ·ͱΊ 2
  2. 3&45GVM"1*ͷ՝୊ BSUJDMFT BSUJDMFTDPNNFOUT BSUJDMFTDPNNFOUT VTFST BSUJDMFTDPNNFOUT VTFST ʜ BSUJDMFTDPNNFOUT VTFST

    7 ௨৴ճ਺͕ଟ͘ͳΓ͕ͪ ˞࡞Γํ࣍ୈͰ͸͋Δ͚ΕͲɺ3&45 ͳઃܭͰ͍͑͹ʜ { “id”: 1, “user_id”: 1, “article_id”: 1, “content”: “この分野は素人なのですが…略”, “created_at”: “2019-11-23 00:00:00”, } { “id”: 10, “user_id”: 5, “article_id”: 1, “content”: “わかるぅ~”, “created_at”: “2019-11-23 06:00:00”, }
  3. 3&45GVM"1*ͷ՝୊ BSUJDMFT BSUJDMFTDPNNFOUT BSUJDMFTDPNNFOUT VTFST BSUJDMFTDPNNFOUT VTFST ʜ BSUJDMFTDPNNFOUT VTFST

    8 ௨৴ྔଟ͘ͳΓ͕ͪ l ຊདྷ࢖͏ͷ͸ Ϣʔβ໊ͱϝʔϧΞυϨεͷΈ l ༨ܭͳ৘ใ·Ͱૹͬͯ͠·͏ { “id”: 1, “name”: “Yamada Taro”, “email”: “[email protected]”, “role_id”: 1, “battle_power”: 530000, “created_at”: “2019-11-22 00:00:00”, “updated_at”: “2019-11-30 00:00:00” } ෆཁʂ
  4. (SBQI2-ͱ͸ʁ l 'BDFCPPL͕։ൃ͍ͯ͠Δ8FC"1*ͷͨΊͷن֨ l ΫΤϦݴޠͱεΩʔϚݴޠ͔Β੒Δ ˓ ΫΤϦݴޠ ˙ σʔλऔಘܥͷRVFSZ ˙

    σʔλߋ৽ܥͷNVUBUJPO ˙ Πϕϯτ௨஌ͷTVCTDSJQUJPO ˓ εΩʔϚݴޠ ˙ ࢓༷Λ໌ه͢ΔͨΊͷݴޠ ˔ ܕ෇͚ l (JU)VC"1*WͰ(SBQI2-Λ࠾༻ 11
  5. (SBQI2-Λௐࠪ RVFSZ 13 l ΫϥΠΞϯτ͕ཉ͍͠ σʔλͷΈऔಘ l Ұ౓ͷ"1*ίʔϧͰશͯ औಘՄೳ l

    σʔλ݅਺͕ଟ͍৔߹͸ɺ ϦϨʔΛఆٛͯ͠ࢦఆ݅਺ຖ ʹऔಘ͢Δ͜ͱ΋Մೳ query { article(id: 1) { id title content status createdAt updatedAt comments { id content user { id name email } } } }
  6. (SBQI2-Λௐࠪ NVUBUJPO 14 l σʔλߋ৽༻ΫΤϦ l ໭Γ஋͸RVFSZͱಉ༷ͷ ϑΥʔϚοτͰऔಘՄೳ mutation {

    creatArticle(input: { title: "タイトル", content: "内容", status: 1, userId: 1 }) { article { id title content status user { id name } } } }
  7. ։ൃΛͯ͠Έͯͷײ૝ʢϝϦοτʣ l εΩʔϚఆٛͱಉ࣌ʹ"1*υΩϡϝϯτ͕׬੒ ˓ ΫϥΠΞϯτଆͷ։ൃऀͱڞ༗ l ςετ͕༰қ ˓ εΩʔϚఆٛϑΝΠϧΛର৅ʹςετ ˓

    &&ͷςετͰ͸ͳ͍ͷͰߴ଎ l σʔλ͕ҰൃͰऔΕΔշײ ˓ σʔλऔಘʹΫϥΠΞϯτଆʹओಋݖ͕͋Δ l "1*ͷೖΓޱΛҰຊԽ ˓ HSBQIRMͷΈ 17
  8. ։ൃͯ͠Έͯͷײ૝ʢσϝϦοτʣ l εΩʔϚఆٛ͢Δͷ͕େม ˓ ϝλϓϩάϥϛϯάՄೳ͕ͩɺεΩʔϚఆٛΛϝλϓϩ͍͍ͯ͠ͷ͔ʁ ͱ͍͏׉౻͕ʜ l / ໰୊͕ൃੜ͠΍͍͢ ˓

    ͨͩ͠ɺϥΠϒϥϦͰղܾՄೳ ˓ औಘՄೳͳ߲໨͕ಈత ˙ ΫϥΠΞϯτଆ͕ཉ͍͠σʔλΛܾఆ͢ΔͨΊ ˙ ࣄલʹϩʔυͰ͖ͳ͍ l Ωϟογϡͮ͠Β͍ ˓ Ͳ͏͍͏σʔλΛฦ͔͢͸ɺΫϥΠΞϯτ࣍ୈͷͨΊ ˓ 3&45GVM"1*ͳΒ͹ɺฦ͢஋͕ܾ·͍ͬͯΔͨΊɺΩϟογϡ͕ޮ͘ l ֶशίετ ˓ 3&45GVM"1*͸ϑϨʔϜϫʔΫͷԆ௕্ʹ͋Δ ˓ (SBQI2-͸ͦ͏Ͱ͸ͳ͍ 18
  9. ։ൃͯ͠Έͯͷײ૝ʢσϝϦοτʣ l εΩʔϚఆٛ͢Δͷ͕େม ˓ ϝλϓϩάϥϛϯάՄೳ͕ͩɺεΩʔϚఆٛΛϝλϓϩ͍͍ͯ͠ͷ͔ʁ ͱ͍͏׉౻͕ʜ l / ໰୊͕ൃੜ͠΍͍͢ ˓

    ͨͩ͠ɺ3BJMTͳΒϥΠϒϥϦͰղܾՄೳ HSBQIRMCBUDI ˓ औಘՄೳͳ߲໨͕ಈత ˙ ΫϥΠΞϯτଆ͕ཉ͍͠σʔλΛܾఆ͢ΔͨΊ ˙ ࣄલʹϩʔυͰ͖ͳ͍ l Ωϟογϡͮ͠Β͍ ˓ Ͳ͏͍͏σʔλΛฦ͔͢͸ɺΫϥΠΞϯτ࣍ୈͷͨΊ ˓ 3&45GVM"1*ͳΒ͹ɺฦ͢஋͕ܾ·͍ͬͯΔͨΊɺΩϟογϡ͕ޮ͘ l ֶशίετ ˓ 3&45GVM"1*͸8FCϑϨʔϜϫʔΫͷԆ௕্ʹ͋Δ ˓ (SBQI2-͸ͦ͏Ͱ͸ͳ͍ 20
  10. ։ൃΛͯ͠Έͯͷײ૝ʢ޻෉ͨ͠ϙΠϯτʣ l ΞΫηεݖݶνΣοΫ ˓ ࿈ܞΞϓϦέʔγϣϯʹΑͬͯ ͸औಘ/(ͳϦιʔε͋Γ ˓ %#͔ΒϦιʔεͷσʔλऔಘ ޙʹνΣοΫͰ͸஗͍ ˓

    ΫΤϦΛղੳɻऔಘ͠Α͏ͱ͠ ͍ͯΔϦιʔεΛಛఆ ˙ ݖݶ͕ͳ͚Ε͹ ͜ͷ࣌఺Ͱ஄͘ ˓ ΫΤϦղੳ΋ॏ͍ ˙ NVUBUJPO͸আ֎ 21 query searchScSomeOne($scId: ID!){ sc(id: $scId) { name shopBrands { name shopCompany { name } } } } アクセス権限のない リソースの取得を検知!
  11. ։ൃ͍ͯͯ͠ͷײ૝ʢϋϚͬͨϙΠϯτʣ l NVUBUJPOʹΑΔόϧΫΠϯαʔτɾΞοϓσʔτΛ ߦͳͬͯ΋͍͍ͷ͔ʁ ˓ ΫΤϦʹ͸ผ໊Λ͚ͭΔ͜ͱ͕Մೳ ˓ ౓ͷίʔϧͰෳ਺ͷNVUBUJPOΫΤϦΛฒ΂ͯόϧΫΠϯαʔτ ͢Δ͜ͱࣗମ͸Ͱ͖ͨ ˓

    ͔͠͠ɺݸผʹNVUBUJPOͷॲཧ࣮ߦ ˙ τϥϯβΫγϣϯ͕ޮ͔ͳ͍ ˓ ΫΤϦղੳΛߦͬͯɺόϧΫΠϯαʔτͰ͋Δ͜ͱΛݕ஌ͨ͠Βɺ τϥϯβΫγϣϯΛൃߦ͢Δ͜ͱ͸ग़དྷͦ͏͕ͩʜ ˙ Ͱ͖Δ͔Β΍͍͍͔ͬͯͱݴΘΕΔͱɺҧ͏ؾ͕͢Δ ˙ σϑΥϧτͷ(SBQI2-͸ͦ͏͍͏ಈ࡞Λظ଴͍ͯ͠Δͷ͔ʁ ˓ JTTVFΛൃݟ ˙ όϧΫΠϯαʔτ༻ͷNVUBUJPOΛఆٛ͠·͠ΐ͏ɺͱ͍͏݁࿦ ˙ ͨͩ͠ɺ࢓্༷ɺෳ਺ͷNVUBUJPOΛฒ΂Δͷ͸0, 22
  12. ·ͱΊ l (SBQI2-͸"1*ͷίʔϧճ਺Λ࡟ݮ l σʔλ௨৴ྔΛ࡟ݮ l εΩʔϚݴޠͰܕͷఆ͕ٛՄೳ l ςετ͕༰қ l

    ͍͍͜ͱ͹͔ΓͰ͸ͳ͍ ˓ ֶशίετ͸3&45GVM"1*ʹൺ΂Δͱߴ͍ ˓ Ωϟογϡ͕ޮ͔ͤʹ͍͘ ˓ / ໰୊͕ൃੜ͠΍͍͢ 23