Upgrade to PRO for Only $50/Yearโ€”Limited-Time Offer! ๐Ÿ”ฅ

SQLAlchemy CustomTypes

SQLAlchemyย CustomTypes

DB Encryption/Decryption using SQLAlchemy Customtypes

Avatar for AhnSeongHyun

AhnSeongHyun

August 24, 2019
Tweet

More Decks by AhnSeongHyun

Other Decks in Programming

Transcript

  1. ์ƒ์šฉ ๋ฒค๋”์‚ฌ - Python ์ž์ฒด๋กœ ์ž‘์„ฑ๋œ ๊ฒƒ์€ ์ „๋ฌด - c/c++,

    .so ํŒŒ์ผ ์—ฐ๋™์„ ์œ„ํ•œ ๊ฐ€์ด๋“œ ์ œ์‹œ HOW
  2. API PROJECT STRUCTURE PRESENTATION BUSINESS LOGIC PERSISTENCE view.py service.py repo.py

    ์–ด๋””์„œ ์•”๋ณตํ˜ธํ™”๋ฅผ ํ•ด์•ผํ• ๊นŒ?
  3. ๋ฐฉ์•ˆ 1. service ์—์„œ ์•”/๋ณตํ˜ธํ™” ์ˆ˜ํ–‰ Pros : - DB

    ๊ด€๋ จ ๋ถ€๋ถ„์—์„œ ์•”ํ˜ธํ™”๋ฅผ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค. - ORM insert, update ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ์ˆ˜ํ–‰.
  4. ๋ฐฉ์•ˆ 1. service ์—์„œ ์•”/๋ณตํ˜ธํ™” ์ˆ˜ํ–‰ Cons: - ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„

    ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์ˆ˜ํ–‰? - ๋ณตํ˜ธํ™”์‹œ ๋ฒˆ๊ฑฐ๋กœ์›€ : - mapper instance ๋‚ด ์ปฌ๋Ÿผ ๋ณ€์ˆ˜๋“ค์ด ์•”ํ˜ธํ™” ๋˜์–ด ์žˆ์Œ - ์ปฌ๋Ÿผ๋ณ„ ๋ณตํ˜ธํ™”๊ฐ€ ๋ถˆ๊ฐ€ํ”ผ ๊ฐ€์žฅ ์†์‰ฝ๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•
  5. ๋ฐฉ์•ˆ 2. ๋ณตํ˜ธํ™” ๋ถ€๋ถ„์€ ORM Mapper ๋‚ด property ๋ฅผ ํ™œ์šฉ

    Pros : - ์ปฌ๋Ÿผ์˜ ๋ฐ˜๋ณต์ ์ธ ๋ณตํ˜ธํ™” ๋ถ€๋ถ„ ์ œ๊ฑฐ(๋ฐฉ์•ˆ 1์— ๋Œ€ํ•œ ๋ณด์™„) - decrypt() ๋ฅผ service ์—์„œ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  6. ๋ฐฉ์•ˆ 2. ๋ณตํ˜ธํ™” ๋ถ€๋ถ„์€ ORM Mapper ๋‚ด property ๋ฅผ ํ™œ์šฉ

    Cons : - encrypt() ๋Š” ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋Š”๋ฐ? - User instance ์ž์ฒด๊ฐ€ ๋ณตํ˜ธํ™”๋œ ๊ฐ’์„ ๋“ค๊ณ  ์žˆ์ง€ ์•Š์€ ์ƒํƒœ - property ํ˜ธ์ถœ์‹œ ๋งˆ๋‹ค, ๋ณตํ˜ธํ™” ์ˆ˜ํ–‰, ์•”ํ˜ธํ™” ์„œ๋ฒ„๋ผ๋ฉด ๋„คํŠธ์›Œํฌ ๋น„์šฉ ์ฆ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ํด๋ž˜์Šค์—๋Š” ๋กœ์ง์„ ๋‹ด๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•˜์ž๋Š” ์˜๊ฒฌ encrypt(), decrypt() ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณณ์ด ๋‹ค๋ฅธ ํŒŒ์ผ/๋‹ค๋ฅธ ๋ ˆ์ด์–ด
  7. ๋ฐฉ์•ˆ 3. repo ์—์„œ ์ˆ˜ํ–‰ Pros : - DB ์•”ํ˜ธํ™”์ด๊ธฐ

    ๋•Œ๋ฌธ์— repo ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ ์ ˆ - ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง ๋ถ„๋ฆฌ Cons: - insert, update, select ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด? ๋น„์Šทํ•œ ๋ถ€๋ถ„ ์žฌ์ž‘์„ฑ! - ์•”ํ˜ธํ™” ํ•ด์•ผํ•˜๋Š” Table ์ด ๋งŽ์•„์ง€๋ฉด? ์žฌ์ž‘์„ฑ! - ์—ฌ์ „ํžˆ ์ปฌ๋Ÿผ๋ณ„ ๋ณตํ˜ธํ™” ์ด์Šˆ
  8. ๋ฐฉ์•ˆ 4. SQLAlchemy ์˜ ORM event ๋ฅผ ํ™œ์šฉ DB ์•”ํ˜ธํ™”์™€

    ๊ด€๋ จ๋œ QUERY - encrypt : insert, update - decrypt : select ์ด๋ฒคํŠธ๋ฅผ ์žก์•„์„œ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜๋Š” ์—†์„๊นŒ? Insert, update ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ encrypt() ๋ฅผ ์ˆ˜ํ–‰? Select ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, decrypt() ๋ฅผ ์ˆ˜ํ–‰?
  9. ๋ฐฉ์•ˆ 4. SQLAlchemy ์˜ ORM event ๋ฅผ ํ™œ์šฉ ORM Event

    - Attribute Event - Mapper Event - Instance Event - Session Event - Query Event ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ ์ œ๊ณต
  10. ๋ฐฉ์•ˆ 4. SQLAlchemy ์˜ ORM event ๋ฅผ ํ™œ์šฉ Pros :

    - ์–ด๋А ์‹œ์ ์— ์•”๋ณตํ˜ธํ™”๋ฅผ ํ•˜๋Š”์ง€ ๋ช…ํ™• - service, repo ๋Š” ์ˆœ์ˆ˜์œ ์ง€ Cons: - ์ปฌ๋Ÿผ๋ณ„ ๊ฐœ๋ณ„ ์•”๋ณตํ˜ธํ™” ์ด์Šˆ - Table ์ด ๋Š˜์–ด๋‚˜๋ฉด? Handler ์ฆ๊ฐ€? ์ข€ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ?
  11. SQLAlchemy CustomTypes TypeDecorator Class - ๊ธฐ์กด Type์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์‚ฌ์šฉ์ž

    ์ง€์ • Type ์ž‘์„ฑ ๊ฐ€๋Šฅ - Subclassing of SQLAlchemyโ€™s built-in types
  12. TypeDecorator process_bind_param - APP => DB - DBAPI ์˜ execute()

    ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋  ๊ฐ’(value) ๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค. - value serializing, transformation - ์ฃผ์˜ : reverse operation - process_result_value()
  13. TypeDecorator process_result_value - APP < = DB - DB ์—์„œ

    ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„(fetch)์— ํ•ด๋‹น - a result-row column value to be converted - ์ฃผ์˜ : reverse operation - process_bind_param()
  14. ๊ฒฐ๋ก  DB์•”ํ˜ธํ™”๋Š” ํ•„์ˆ˜ ์‚ฌํ•ญ ์–ด๋””์—์„œ ์•”ํ˜ธํ™”๋ฅผ ํ•  ๊ฒƒ์ธ๊ฐ€? - USE

    CASE? DATA? ๊ณ ๋ คํ•ด์•ผํ•  ์‚ฌํ•ญ: - ์•”๋ณตํ˜ธํ™” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•˜๋Š” ๋ถ€๋ถ„ ์ด์Šˆ - ORM Mapper ์ปฌ๋Ÿผ๋ณ„ ๋ณตํ˜ธํ™” ์ด์Šˆ - ํ…Œ์ŠคํŠธ/์œ ์ง€๋ณด์ˆ˜
  15. ๊ฒฐ๋ก  SQLAlchemy CustomTypes - TypeDecorator : ๊ธฐ์กด ํƒ€์ž… + ์ถ”๊ฐ€๊ธฐ๋Šฅ

    => ์‚ฌ์šฉ์ž ์ปค์Šคํ…€ ํƒ€์ž… - process_bind_param : execute() ๋กœ ์‹คํ–‰๋˜๊ธฐ์ „ ๋ฐ”์ธ๋“œ ๋˜๋Š” ๊ฐ’์„ ์กฐ์ž‘ - process_result_value : DB ์—์„œ fetch ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ฐ’์„ ์กฐ์ž‘
  16. ๊ฒฐ๋ก  TypeDecorator + DB ์•”ํ˜ธํ™” ORM Mapper ํด๋ž˜์Šค ์ž์ฒด์—์„œ Column

    ๋ณ„ ์ง€์ • ๋ช…์‹œ์ ์œผ๋กœ ์–ด๋–ค ์ปฌ๋Ÿผ์ด ์•”๋ณตํ˜ธํ™” ๋Œ€์ƒ์ธ์ง€ ๋ˆ„๊ตฌ๋‚˜ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์œ ์ง€๋ณด์ˆ˜ ์•”๋ณตํ˜ธํ™”๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์ด EncryptedField ์—์„œ๋งŒ ์ˆ˜ํ–‰ ํ…Œ์ŠคํŠธ ์šฉ์ด ๋ณต์žก๋„ ๊ฐ์†Œ Business Logic ์„ ์ฒ˜๋ฆฌํ•˜๋Š” service ๋Š” ์ˆœ์ˆ˜ Persistence ์— ํ•ด๋‹นํ•˜๋Š” repo ๋Š” ORM ๊ด€๋ จ ์ฝ”๋“œ๋งŒ ์กด์žฌ