Ruby on Rails

Rails7 ActivieRecord::Encryption 적용하기

juyeong.lee 2023. 7. 9. 15:31
반응형

Ruby on Rails 7에 Active Record Encryption이 추가되었다.

기본적으로 레일즈 가이드 문서에 친절하게 필요한 내용이 다 나와있어서 적용에 문제가 없었다.

 

암호화에 필요한 random key set 아래 명령어로 생성할 수 있다.

$ bin/rails db:encryption:init
active_record_encryption:
  primary_key: ...
  deterministic_key: ...
  key_derivation_salt: ...

 

이 key set은 credential file에 추가하면 바로 사용할 수 있게 된다. (Ruby on Rails custom credentials)

 

만약 credential file을 사용하지 않는다면, config/application.rb 파일에 아래 코드를 추가해주면 된다.

config.active_record.encryption.primary_key = ENV["PRIMARY_KEY"]
config.active_record.encryption.deterministic_key = ENV["DETERMINISTIC_KEY"]
config.active_record.encryption.key_derivation_salt = ENV["KEY_DERIVATION_SALT"]

 

 

 

암호화를 적용할 attribute는 model에 정의하면 된다.

class User < ApplicationRecord
  encrypts :phone
end

default로 non-deterministic encryption이 되기 때문에 필요에 따라 옵션을 설정해 줄 수 있다.

class User < ApplicationRecord
  encrypts :phone, deterministic: true
end

deterministic encrypted data를 쿼리할 때 case ignore이 필요하다면 아래 옵션을 추가하면 된다.

encryption 진행 전에 내용을 downcase 하는 설정이다.

class User < ApplicationRecord
  encrypts :phone, deterministic: true, downcase: true
end

 

이렇게 해 두면 추가 작업 없이 다른 model 다루던 것처럼 이용할 수 있다. 아주 편하다!

user = User.create!(name: "Judy", phone: "01012345678")
user.phone
# => "01012345678"

User.find_by(phone: "01012345678")
# => #<User id:1, name: "Judy", phone: "01012345678", created_at: ...>

다만 DB에서 직접 값을 확인하면 아래와 같은 형태로 저장이 되어 있는 것을 확인할 수 있다.

'{\"p\":\"값\",\"h\":{\"iv\":\"다른값\",\"at\":\"또다른값\"}}'

 

관련해서 자료를 찾아보다가 GitHub에서 기존에 사용하던 internal encryption library를 Active Record Encryption으로 마이그레이션 하는 과정에 대해 작성한 블로그 포스트를 발견했다. 관심 있으신 분들은 이 자료를 참고해 봐도 좋을 것 같다.

https://github.blog/2022-11-03-how-github-converts-previously-encrypted-and-unencrypted-columns-to-activerecord-encrypted-columns/

반응형