Ruby on Rails 웹 애플리케이션 보안 상세
1. 인증 및 세션 관리
-
인증 제너레이터: Rails 8.0부터 기본 제공되는
authentication제너레이터는User,Session모델,SessionsController,PasswordsController,Authenticationconcern 등을 생성하여 기본적인 인증 및 비밀번호 재설정 기능을 제공합니다. -
비밀번호 해싱:
bcryptGem을 사용하여 비밀번호를 단방향 해싱하여 저장하며, 이는 되돌릴 수 없습니다. -
세션 관리: Rails는
ActionDispatch::Session::CookieStore를 기본 세션 저장소로 사용하며, 클라이언트 측 쿠키에 세션 해시를 저장합니다.secret_key_base를 통해 쿠키를 암호화하고 무결성을 보장합니다. -
세션 하이재킹 방어: SSL 강제화(
config.force_ssl = true), 로그아웃 기능 제공,httpOnly플래그를 사용한 쿠키 보호 등의 조치가 필요합니다. -
세션 고정(Session Fixation) 방어: 로그인 성공 후 새로운 세션 ID를 발급하여 공격자가 고정한 세션 ID를 사용할 수 없도록 합니다.
-
세션 만료:
updated_at및created_at컬럼을 활용하여 일정 시간 이상 사용되지 않거나 오래된 세션을 주기적으로 삭제합니다.
2. CSRF (Cross-Site Request Forgery) 방어
-
HTTP 메서드 활용: W3C 가이드라인에 따라 GET은 안전한 조회 작업에, POST (및 PATCH, PUT, DELETE)는 상태 변경 작업에 사용해야 합니다.
-
보안 토큰: Rails는
protect_from_forgery를 통해 모든 비-GET 요청에 보안 토큰을 포함하여 CSRF 공격을 방어합니다.csrf_meta_tags헬퍼는 Turbo 및 JavaScript Ajax 요청에 필요한 토큰을 제공합니다. -
지속성 쿠키:
cookies.permanent와 같은 지속성 쿠키 사용 시 기본 CSRF 보호가 무효화될 수 있으므로,ActionController::InvalidAuthenticityToken예외 처리 로직을 구현해야 합니다.
3. 리다이렉션 및 파일 보안
-
안전한 리다이렉션: 사용자 입력이 리다이렉션 URL에 직접 사용될 경우 피싱 및 XSS 공격에 취약하므로, 허용 목록(permitted list) 기반의 검증을 통해 안전한 URL로만 리다이렉트되도록 합니다.
-
파일 업로드 보안: 악성 파일명으로 서버 파일을 덮어쓰거나 서비스 거부 공격을 유발할 수 있으므로, 파일명 필터링(허용 목록 방식), 미디어 파일 비동기 처리, 웹 서버 DocumentRoot 외부에 저장하는 것이 필수적입니다.
-
파일 다운로드 보안:
send_file()사용 시 사용자 입력 파일명을 직접 사용하지 않고, 요청된 파일이 예상된 디렉토리에 있는지 확인하여 임의 파일 다운로드를 방지합니다.
4. 계정 공격 방어
-
무차별 대입 공격: 일반적인 오류 메시지,
rate_limit를 이용한 비율 제한, CAPTCHA 도입 등을 통해 방어합니다. -
계정 탈취: 비밀번호 변경 시 기존 비밀번호 확인, 이메일 주소 변경 시 비밀번호 확인 등 추가 인증 절차를 요구하여 계정 탈취를 어렵게 합니다.
5. 인젝션 공격 (XSS, SQL Injection)
- SQL Injection: `Model.where(