프레임워크별
Ruby on Rails 보안 대책 — Strong Parameters·인가·gem CVE 방어법
Rails는 규약과 안전한 기본값(CSRF 보호·Strong Parameters)을 많이 갖추지만, 사고는 운영에서 일어납니다. 3대 = Strong Parameters 과다 허용(Mass Assignment) / 인가의 작업 부족(인증≠인가) / gem(의존성)의 알려진 CVE. 더해 SQL 문자열 결합·위험한 동적 메서드. 기본값을 살리며 막는 방법을 공격 절차는 빼고 풀어냅니다.
대상: Ruby on Rails로 앱을 운영하는 사람. 여기서는 공격 절차를 다루지 않고, 안전한 기본값을 살리면서, 운영에서 열리는 구멍을 막는 방법을 풀어냅니다. 전체 그림은 프레임워크별 보안의 입구도 참조하세요.
3대 함정(기본값을 벗어나면 열린다)
Rails의 기본값은 우수하지만, 다음 3가지는 개발자가 의식하며 지키는 영역입니다.
① Mass Assignment
Strong Parameters를 넓게 허용해 is_admin 등을 예상 밖으로 덮어쓴다.
② 인가의 부족
인증은 있지만 소유자 스코프 없음. ID 교체로 남의 데이터(IDOR).
③ gem의 알려진 CVE
의존성 gem의 취약점을 방치. 실가동 버전으로 판정해 즉시 패치.
그 밖에 where로의 문자열 결합에 의한 SQLi, send/constantize 같은 위험한 동적 메서드에 사용자 입력을 넘기는 것, credentials/secret_key_base의 누출도 주의점입니다.
막는 법(3스텝)
Strong Parameters를 필요 최소한으로 좁힌다
is_admin 같은 권한 필드는 사용자 입력에서 대입되게 하지 않는다. "번거로우니 넓게 허용"을 그만둔다.인가를 명시적으로 작성한다
current_user의 스코프로 리소스를 좁히고, Pundit / CanCanCan 등으로 인가 방침을 명시한다. 취득·갱신·삭제 때마다 소유자를 확인(→ IDOR란).gem(의존성)의 CVE를 모니터링해 즉시 패치
where는 플레이스홀더를 써 문자열 결합을 피한다.자주 하는(위험한)
- Strong Parameters를 넓게 허용(Mass Assignment)
- 인가를 작성하지 않고 "로그인 = 열람 가능"
- gem의 알려진 CVE를 방치
where("... #{params}")의 문자열 결합
올바른
- permit를 필요 최소한으로
- 인가를 명시(current_user/Pundit)
- gem을 CVE 모니터링 + 즉시 패치
where는 플레이스홀더
본 사이트의 관점: 규약에 지켜져도 '인가와 의존성'은 자신의 책임
Rails의 좋은 기본값은 많은 위험을 지워주지만, '누가·무엇을·해도 되는가'라는 인가와 의존성의 신선도만은 프레임워크가 자동으로 지킬 수 없습니다. 본 사이트가 반복해서 보는 사고도, 정교한 공격보다 "인증은 있는데 소유자 확인이 없는" 유형이 많습니다. 그래서 방어의 무게 중심은 Strong Parameters를 죄고, 인가를 명시하고, gem을 CVE 모니터링하는 것. 화려하지 않아도 이 소박한 3가지가 Rails 실운영 사고의 대부분을 막습니다.
다음으로 읽기
- 입구: 프레임워크별 보안(입구) / Laravel 보안 대책(같은 MVC·인가의 형태가 가깝다)
- 실무: 취약점(CVE) 대응 실무 / 의존성 CVE 모니터링
- 용어: IDOR란 / SQL 인젝션이란
FAQ
QRuby on Rails는 안전한 프레임워크인가요?
Rails는 '설정보다 규약'으로 안전한 기본값을 많이 갖춥니다 — CSRF 보호, Strong Parameters, ORM에 의한 SQL 대책 등이 표준입니다. 올바르게 쓰면 견고한 프레임워크지만, 기본값을 벗어나거나 필요한 작업을 게을리하면 구멍이 됩니다. 특히 Strong Parameters의 과다 허용, 인가의 부족, gem(의존성)의 방치된 CVE는 Rails 고유라기보다 운영의 문제로 반복해서 일어납니다.
QStrong Parameters에서 주의할 점은?
Strong Parameters는 받아들일 필드를 명시적으로 허용(permit)하는 구조로, Mass Assignment(예상 밖 필드의 일괄 대입)를 막기 위한 것입니다. 위험한 것은 번거롭다고 넓게 허용해 버리는 것. permit하는 항목을 필요 최소한으로 좁히고, is_admin 같은 권한 필드는 절대 사용자 입력에서 대입되게 하지 마세요.
Q'로그인해 있으면 볼 수 있다'는 왜 위험한가요?
그것은 인증은 있지만 인가가 없는 상태입니다. Rails는 로그인(인증)의 구조는 제공하지만, 그 데이터가 정말 그 사용자의 것인지라는 인가는 앱 고유이며 직접 작성해야 합니다. current_user의 스코프로 리소스를 좁히거나 Pundit/CanCanCan 등으로 방침을 명시하는 작업을 게을리하면, URL의 ID 교체로 남의 데이터가 보여버립니다(IDOR).