ID 숨김의 필요성
애플리케이션의 URL이나 마크업에 데이터베이스 ID가 노출되면 다음과 같은 문제가 발생할 수 있습니다.
-
보안 취약성: ID를 통해 리소스에 직접 접근하거나 유추할 수 있어 보안 위험이 증가합니다.
-
경쟁사 분석: 경쟁사가 ID를 기반으로 서비스의 성장률이나 총 리소스 수를 추정할 수 있습니다.
기존 ID 숨김 솔루션 및 한계
다양한 Ruby Gem들이 ID 숨김 기능을 제공하지만, 각각의 한계가 존재합니다.
-
Friendly ID: 모든 모델에
slug속성 추가 및 업데이트 필요. -
Slugifiable:
slug마이그레이션 추가 필요. -
Hashid-rails: 5년 이상 업데이트되지 않았으며, 기본
find메서드 대신find_by_hash_id사용 필요. -
ID Gem: 기본 Rails
find메서드 미지원,find_by_id대신find_by사용 필요. -
Prefixed ID: 생성되는 ID가 매우 길어질 수 있으며, 일부
find메서드에find_by_prefix_id사용 필요.
Bullet Train의 ObfuscatedId Concern 활용
이러한 한계점을 극복하고 ‘드롭인(drop-in)’ 솔루션을 제공하는 방법으로 오픈소스 Rails 보일러플레이트인 Bullet Train에서 사용되는 ObfuscatedId Concern을 활용합니다. 이 Concern은 hash_ids Gem과 함께 작동하며, 다음과 같은 특징을 가집니다.
-
간편한 통합:
ApplicationRecord에include ObfuscatedId만 추가하면 됩니다. -
기존
find메서드 지원: Rails의 기본find메서드를 오버라이드하여 추가적인 코드 변경 없이 숨겨진 ID를 사용할 수 있도록 합니다. -
to_param오버라이드:to_param메서드를 오버라이드하여 URL에 해시된 ID를 자동으로 표시합니다.
구현 단계
-
app/models/concerns/obfuscated_id.rb파일 생성 후 Bullet Train 소스 코드에서ObfuscatedIdConcern 코드를 복사합니다. (출처 명시 권장) -
Gemfile에gem 'hash_ids'를 추가하고bundle install을 실행합니다. -
app/models/application_record.rb파일에include ObfuscatedId를 추가합니다. -
Rails 콘솔 또는 애플리케이션 서버를 재시작하여 변경사항을 적용하고,
organization.to_param등을 통해 해시된 ID가 정상적으로 출력되는지 확인합니다.