강력한 매개변수
안전한 매개변수를 다룹니다
강력한 매개변수은(는) CoddyKit의 무료 Ruby Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Ruby Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Ruby Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
대량 할당 문제
양식은 한 번에 여러 필드를 보냅니다. 이 필드를 모두 모델에 무조건 전달하면 공격자가 의도하지 않은 필드를 추가하여 admin: true와 같이 설정할 수 있습니다. 이것이 대량 할당 취약점입니다.
- 사용자 입력은 절대 신뢰하지 않습니다.
- 허용할 필드를 허용 목록에 명시해야 합니다.
- Rails는 강력한 매개변수로 이를 적용합니다.
강력한 매개변수란 무엇일까요?
강력한 매개변수를 사용하면 모델이 받아들일 params를 명시적으로 선언해야 합니다. 허용되지 않은 params를 대량 할당하려고 하면 Rails가 오류를 발생시킵니다.
이렇게 하면 조용히 남아 있는 보안 허점을 검토된 필드 허용 목록을 통해 명시적으로 선택하는 방식으로 바꿀 수 있습니다.
require와 permit
이 패턴은 두 메서드를 사용합니다.
require(:model)은 최상위 키가 존재하는지 확인합니다.permit(:field, ...)은 내부 필드를 허용 목록에 추가합니다.
def article_params
params.require(:article).permit(:title, :body)
end도우미 사용
비공개 model_params 메서드를 정의하고, 생성하거나 수정할 때 호출합니다. 원본 params를 모델에 직접 전달하지 마세요.
def create
@article = Article.new(article_params)
@article.save
redirect_to @article
end
private
def article_params
params.require(:article).permit(:title, :body)
end왜 비공개 메서드일까요?
허용 목록을 하나의 비공개 메서드에 두면 다음과 같은 장점이 있습니다.
create와update가 같은 규칙을 공유합니다.- 허용된 필드를 쉽게 찾고 검토할 수 있습니다.
- 컨트롤러 액션으로 노출되지 않습니다(비공개 메서드는 경로로 연결할 수 없습니다).
필터링되는 항목
제출된 키 중 permit 목록에 없는 키는 모델에 도달하기 전에 삭제됩니다. 양식에 어떤 이유로 admin이 포함되어 있어도 title과 body만 허용한다면 admin 값은 조용히 무시되므로 레코드를 안전하게 유지할 수 있습니다.
배열 허용
체크박스 목록이나 배열을 보내는 다중 선택 입력의 경우, 값을 빈 배열로 전달하여 허용합니다. 그러면 해당 키에 여러 값을 사용할 수 있습니다.
params.require(:article).permit(:title, tag_ids: [])중첩 해시 허용
중첩된 속성(부모와 자식 항목을 한 번에 수정하는 양식)의 경우 내부 필드를 설명하는 해시와 함께 중첩된 키를 허용합니다.
params.require(:order).permit(
:customer_name,
items_attributes: [:product_id, :quantity]
)누락된 params 처리
필수 키가 없으면 require가 ParameterMissing을 발생시키며, Rails는 이를 400 잘못된 요청으로 렌더링합니다. 따라서 잘못된 요청으로부터 액션을 자동으로 보호할 수 있습니다.
# Missing :article key raises:
# ActionController::ParameterMissingpermit!은 위험합니다
모든 항목을 허용하려면 params.permit!을 호출할 수 있지만, 그러면 대량 할당 취약점이 다시 열립니다. 신뢰할 수 있는 내부 문맥을 제외하고는 사용하지 마십시오. 항상 명시적인 허용 목록을 우선하십시오.
모범 사례
매개변수를 안전하게 유지하십시오:
- 필드의 최소 집합만 허용 목록에 추가하십시오.
- 공개 양식에서
role이나admin같은 민감한 플래그를 절대 허용하지 마십시오. - 서버 측 논리에 따라 이러한 필드를 컨트롤러에서 명시적으로 설정하십시오.
빠른 확인
강력한 매개변수에 대한 이해도를 확인해 보십시오.
복습: 강력한 매개변수
입력을 안전하게 필터링하는 방법을 배웠습니다:
- 대량 할당은 실제 보안 위험입니다.
require는 최상위 키를 요구하고,permit은 필드를 허용 목록에 추가합니다.- 허용 목록을 공유되는 비공개 메서드에 유지하십시오.
- 필요할 때 배열과 중첩 해시를 허용하십시오.
permit!은 피하고 민감한 플래그는 절대 허용하지 마십시오.
다음에는 뷰와 렌더링을 사용하여 응답을 반환합니다.
자주 묻는 질문
“강력한 매개변수” 강의는 무료인가요?
네 — “강력한 매개변수” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Ruby Academy 강의 전체를 잠금 해제할 수 있습니다. Ruby Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“강력한 매개변수”에서 뭘 배우나요?
안전한 매개변수를 다룹니다 브라우저에서 직접 실행하는 실습 코드로 Ruby Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Ruby Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Ruby Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“강력한 매개변수” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Ruby Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Ruby Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.