Rails 앱 보안 점검 — CSRF, SQL Injection 막기

2025. 7. 29. 09:00·Ruby On Rails
728x90
반응형

웹 애플리케이션을 운영한다는 건 단지 기능만 잘 구현하는 게 아닙니다.
그보다 더 중요한 건 서비스를 안전하게 지키는 일이죠.
이번 글에서는 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는 대부분의 보안 기능을 기본값으로 잘 챙겨주지만, 우리가 그 원리를 이해하고 제대로 사용하는 것이 진짜 안전을 만들어 줍니다.

728x90
반응형

'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
'Ruby On Rails' 카테고리의 다른 글
  • Capistrano로 자동 배포 파이프라인 만들기
  • Heroku로 Rails 앱 배포하기 — 빠르고 간단한 클라우드 배포
  • 메일 발송 기능 구현 — ActionMailer와 Gmail SMTP 연동하기
  • 댓글 기능 추가하기 — 모델 연관관계 완전 정복
코드를 걷는 사람
코드를 걷는 사람
devwanderer 님의 블로그 입니다.
  • 코드를 걷는 사람
    터미널 밖으로 나온 개발자
    코드를 걷는 사람
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Flutter
        • Flutter 게시판 앱 만들기
        • Flutter 뉴스 앱 만들기
        • Flutter 메모 앱 만들기
        • Flutter 캘린더 앱 만들기
        • Flutter 날씨 앱 만들기
      • Next.js
      • Ruby On Rails
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    openweather
    flutter상태관리
    ActiveRecord
    정적사이트
    table_calendar
    날씨앱
    Nextjs
    코드를걷는사람
    Firebase
    개발블로그
    RubyOnRails
    감성앱
    모바일앱개발
    fluttertips
    UIUX
    Flutter
    백엔드개발
    rails보안
    flutter게시판
    뉴스앱
    flutter개발
    캘린더앱
    메모앱
    flutter앱개발
    flutter기초
    북마크기능
    flutterui
    flutter디자인
    다크모드
    UI디자인
  • 최근 댓글

  • 최근 글

  • 반응형
    250x250
  • hELLO· Designed By정상우.v4.10.3
코드를 걷는 사람
Rails 앱 보안 점검 — CSRF, SQL Injection 막기
상단으로

티스토리툴바