웹 애플리케이션을 운영한다는 건 단지 기능만 잘 구현하는 게 아닙니다.
그보다 더 중요한 건 서비스를 안전하게 지키는 일이죠.
이번 글에서는 Rails 앱을 개발할 때 반드시 신경 써야 할 보안 이슈 중, 가장 대표적인 CSRF
와 SQL Injection
을 다뤄보겠습니다.
🛡️ CSRF(Cross Site Request Forgery) 방지
❓ CSRF란?
로그인된 사용자의 세션을 악용해 의도하지 않은 요청을 보내는 공격입니다.
예를 들어, 사용자가 로그인된 상태에서 악성 사이트에 접속하면 모르게 포스트가 삭제되거나 설정이 바뀌는 등의 피해가 발생할 수 있어요.
✅ Rails의 기본 방어
Rails는 기본적으로 CSRF 공격을 막기 위한 토큰 기반 보호가 활성화돼 있습니다.
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
end
🔐 폼에는 자동으로 토큰 포함
<%= form_with model: @post, local: true do |f| %>
<%= f.text_field :title %>
<%= f.submit %>
<% end %>
<form>
내부에는 Rails가 자동으로 <input type="hidden" name="authenticity_token" ...>
을 삽입해 줍니다.
🌍 AJAX 요청에도 CSRF 토큰 필요
# app/javascript/packs/application.js
import Rails from "@rails/ujs"
Rails.start()
이 설정은 모든 AJAX 요청에 자동으로 CSRF 토큰을 헤더에 추가해줍니다.
💥 SQL Injection 방지
❓ SQL Injection이란?
사용자의 입력값에 SQL 구문을 삽입하여 DB를 조작하는 공격입니다.
예를 들어, 다음과 같은 코드에는 치명적인 취약점이 있어요:
User.where("email = '#{params[:email]}'")
이렇게 되면 params[:email]
에 악성 SQL이 삽입되어 실행될 수 있습니다.
✅ ActiveRecord의 바인딩 방식 사용
User.where(email: params[:email])
Rails의 ActiveRecord는 자동으로 입력값을 이스케이프 처리해 주기 때문에 SQL Injection을 예방할 수 있어요.
🧠 직접 쿼리 작성 시에도 바인딩을 사용하자
User.where("created_at > ?", 1.week.ago)
?
자리에 안전하게 값이 바인딩되므로 SQL 조작 위험이 줄어듭니다.
🔍 그 외 Rails 보안 팁 요약
- strong parameters로 mass-assignment 방지
- devise 등 인증 시스템은 최신 버전 유지
- html_escape 자동 적용:
<%= %>
태그는 XSS 방어 - production 환경에서는 debug 꺼두기
- API 모드에서는 CSRF 비활성화 여부 점검
🎯 마치며
보안은 한 번 구축하고 끝나는 게 아닙니다. 기능 하나 추가할 때마다, 코드 한 줄 작성할 때마다 우리는 항상 보안을 염두에 두어야 해요.
Rails는 대부분의 보안 기능을 기본값으로 잘 챙겨주지만, 우리가 그 원리를 이해하고 제대로 사용하는 것이 진짜 안전을 만들어 줍니다.
'Ruby On Rails' 카테고리의 다른 글
Capistrano로 자동 배포 파이프라인 만들기 (2) | 2025.08.05 |
---|---|
Heroku로 Rails 앱 배포하기 — 빠르고 간단한 클라우드 배포 (2) | 2025.07.31 |
메일 발송 기능 구현 — ActionMailer와 Gmail SMTP 연동하기 (3) | 2025.07.24 |
댓글 기능 추가하기 — 모델 연관관계 완전 정복 (4) | 2025.07.22 |
관리자 페이지 만들기 — RailsAdmin vs ActiveAdmin (0) | 2025.07.17 |