🚫

Strong Parameters

Mass Assignment 공격 방지

Strong Parameters는 Mass Assignment 공격을 방지하는 Rails의 보안 기능입니다.

Mass Assignment 공격이란?

# 악의적인 사용자가 admin=true를 몰래 전송
POST /users { user: { name: "Hacker", email: "...", admin: true } }

방어:

def user_params
  params.require(:user).permit(:name, :email, :password)
  # admin 필드는 permit에 없으므로 자동 무시됨!
end

def create
  @user = User.new(user_params)  # 안전
  # @user = User.new(params[:user])  # 위험! (Rails 4 이전 방식)
end

중첩 파라미터:

params.require(:post).permit(
  :title, :content,
  tags: [],                           # 배열
  comments_attributes: [:id, :body]   # 중첩 모델
)

역할별 다른 허용 필드:

def user_params
  if current_user.admin?
    params.require(:user).permit(:name, :email, :role, :admin)
  else
    params.require(:user).permit(:name, :email)
  end
end

핵심 포인트

1

params.require(:model) — 필수 파라미터 키 검증

2

.permit(:field1, :field2) — 허용할 필드 화이트리스트

3

허용되지 않은 필드는 자동으로 필터링 (무시)

4

Model.create(permitted_params) 로 안전하게 생성

5

중첩: permit(tags: [], address: [:city, :zip])

6

역할별 분기로 admin/일반 사용자 다른 필드 허용

장점

  • Mass Assignment 공격 원천 차단
  • 허용 필드가 코드에 명시적
  • Controller에서 관리 → Model에 보안 로직 불필요
  • 중첩/배열 파라미터도 지원

단점

  • 새 필드 추가 시 permit 업데이트 잊기 쉬움
  • 복잡한 중첩 구조에서 설정이 까다로움
  • 허용되지 않은 필드 무시를 모르면 디버깅 어려움

사용 사례

모든 폼 데이터 처리 API 요청 파라미터 필터링 역할별 권한 구분 중첩 폼 데이터 처리