본문 바로가기

소프트웨어 이야기/장고와 루비온레일즈

레일즈4 + Mass Assignment + Strong Parameter

MassAssignment

MassAssignment가 발생할 수 있는 상황 

class UserController < ApplicationController 
    def create
       User.create(params)
    end
end 

레일즈에서는 넘겨받은 파라미터로, 바로 모델을 생성할 수 있다. 위의 예제를 보면, 받아온 파라미터를 다른 가공없이 User 객체의 속성값으로 사용하여, 객체를 생성한다. 그런데 사용자가 보내준 파라미터를 그대로 데이터를 만드는 데에 사용하는건 보안상 이슈가 있다. 만약에 User 테이블 속성이 id, name, password, is_admin으로 구성되어 있다면, 사용자가 is_admin 파라미터를 true으로 설정해서 넘겨버린다면, 해당 유저는 어드민 계정으로 등록이 되어버릴 수 있다. 

사용자가 원하지 않는 파라미터를 보낸 예시 

{ id: 1, name: 'banana', password: '#@$DSSD', is_admin: true }

그렇기 때문에 우리는 화이트리스트에 해당하는 파라미터들을 따로 명시해줘야한다. 그래야, 원하지 않는 파라미터들이 들어와서 데이터를 휘집고 다니는 것을 막을 수 있다! ( 참고 링크 : 라라벨 한국어 매뉴얼 )




Strong Parameter

위의 문제를 해소하기 위해, Rails 4의 Core 기능에는 Strong Parameter라는 기능이 들어갔다. ( 참고: Strong Prameter Gem )

아래처럼, 허가할 파라미터를 정의해둔 프라이빗 함수 ( user_params)를 액션 컨트롤러에 추가해주면 된다.

class UserController < ApplicationController
def create
User.create(user_params)
end

private
def user_params
params.require('user').permit(
:id,
:password
)
end
end
  • require에서 지정한 키값이 있는 경우에만, user_params 파라미터를 사용할 수 있다.
    • 위의 예시에서는 user를 키값으로 설정했는데, 만약 사용자가 넘겨준 파라미터에 user라는 키가 없으면 ActionController::ParameterMissing 에러가 발생한다.
    • 이 예외가 발생하면, ActionController::Base가 이를 캐치해내어, 400 Bad Request를 반환해준다.
  • 위에서 정의해둔 파라미터 메서드인 user_params를 사용하는게 아니라, params[:user]를 사용하려고 하는 경우 ( 검증없이 매개변수를 통채로 넘기는 상황인 경우), ActiveModel::ForbiddenAttributesError가 발생한다.

( 관련된 자세한 내용은 "스트롱 파라미터 - ROR 가이드"를 참고하면 된다 )