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으로 마이그레이션 하는 과정에 대해 작성한 블로그 포스트를 발견했다. 관심 있으신 분들은 이 자료를 참고해 봐도 좋을 것 같다.
'Ruby on Rails' 카테고리의 다른 글
[Mac] Rails7 프로젝트 생성 후 pg gem 오류 해결방법 (0) | 2023.07.09 |
---|---|
Rails6 프로젝트 AWS EC2에 배포하기 (0) | 2021.08.05 |
Rails 프로젝트에 Framework7 Icons 적용하기 (0) | 2021.07.18 |
Rails6 프로젝트에 Framework7 적용하기 (0) | 2021.07.18 |
[Mac] rvm으로 ruby version 관리하기 (0) | 2021.07.18 |