백엔드 보안
인증과 권한 부여부터 일반적인 취약점과 방어 방법까지, 핵심 백엔드 보안 관행을 이해하세요.
백엔드 보안이 중요한 이유
백엔드 시스템은 민감한 데이터와 중요한 작업을 처리하므로, 제대로 보호되지 않으면 공격의 주요 대상이 됩니다.
- 백엔드는 자격 증명, 개인 정보, 금융 정보와 같은 민감한 데이터를 저장합니다.
- 보안은 무단 접근을 방지하고 데이터 유출로부터 보호합니다.
- 공격은 외부 사용자와 내부 시스템 구성 요소 모두를 대상으로 할 수 있습니다.
상세정보
백엔드 시스템은 사용자 자격 증명, 개인 데이터, 금융 기록, 내부 서비스 간 통신을 포함해 애플리케이션에서 가장 민감한 부분들을 처리하는 역할을 합니다. 이러한 시스템이 침해되면 데이터 유출부터 서비스 전체 중단까지 심각한 영향을 초래할 수 있습니다.
보안은 누가 시스템에 접근할 수 있는지, 그리고 어떤 작업을 수행할 수 있는지를 엄격하게 통제하기 위해 존재합니다. 이러한 통제가 없으면 어떤 클라이언트든 중요한 데이터에 접근하거나 수정할 가능성이 있습니다.
일반적인 위협에는 무단 접근 시도, 대규모 데이터 유출, 그리고 시스템 취약점을 악용하도록 설계된 악의적인 공격이 포함됩니다. 이러한 위협은 운영 환경에서 지속적으로 발생하므로 적극적으로 방어해야 합니다.
높은 수준에서 보면, 백엔드 보안은 클라이언트와 시스템 사이에 보호 계층을 추가합니다. 모든 요청은 애플리케이션 로직에 도달하기 전에 보안 통제를 통과해야 합니다. 이러한 통제는 유효하고 권한이 부여된 작업만 실행되도록 보장합니다.
인증
인증은 시스템에 대한 접근을 허용하기 전에 사용자 또는 서비스의 신원을 확인합니다.
- 사용자는 비밀번호나 토큰 같은 자격 증명을 사용해 신원을 증명합니다.
- 시스템은 접근을 허용하기 전에 이러한 자격 증명을 검증합니다.
- 인증은 사람 사용자와 서비스 모두에 적용됩니다.
상세정보
인증은 백엔드 시스템을 보호하는 첫 번째 단계입니다. 이는 “누가 이 요청을 보내고 있는가?”라는 근본적인 질문에 답합니다. 어떤 작업도 허용되기 전에 시스템은 요청자의 신원을 확인해야 합니다.
이 과정에는 일반적으로 자격 증명이 사용됩니다. 사용자는 비밀번호를 입력하거나, 세션 토큰을 제시하거나, API 키를 사용할 수 있습니다. 더 고급 설정에서는 Google 같은 ID 제공자나 기업용 인증 시스템이 애플리케이션을 대신해 신원을 검증할 수 있습니다.
자격 증명이 검증되면 시스템은 신원이 확인되었다고 판단합니다. 이것이 사용자가 무엇이든 할 수 있다는 뜻은 아닙니다. 이는 단지 그 사람이 누구인지 확인했을 뿐입니다. 무엇을 할 수 있는지는 별도로 권한 부여가 처리합니다.
인증이 없으면 시스템은 정상 사용자와 악의적인 행위자를 구분할 방법이 없게 되어, 안전한 접근 제어가 불가능해집니다.
권한 부여
권한 부여는 인증된 사용자나 서비스가 시스템 내에서 무엇을 할 수 있는지를 결정합니다.
- 권한 부여는 신원이 확인된 후 권한을 검사합니다.
- 접근은 역할이나 정책에 따라 허용되거나 거부됩니다.
- 서로 다른 사용자는 리소스에 대해 서로 다른 수준의 접근 권한을 가질 수 있습니다.
상세정보
사용자가 인증되면 시스템은 그가 누구인지 알게 되지만, 여전히 어떤 작업을 수행할 수 있는지 결정해야 합니다. 이것이 바로 권한 부여의 역할입니다.
권한 부여는 권한을 확인하는 방식으로 동작합니다. 예를 들어, 일반 사용자는 자신의 데이터만 볼 수 있는 반면, 관리자는 계정을 삭제하거나 시스템 설정을 수정할 수 있을 수 있습니다. 이러한 규칙은 역할, 접근 제어 목록, 또는 정책 기반 시스템을 통해 적용됩니다.
이 과정은 간단한 흐름을 따릅니다: 인증된 사용자가 요청을 보내면, 시스템이 해당 사용자의 권한을 확인한 뒤 작업을 허용하거나 거부합니다.
적절한 권한 부여가 없으면 인증된 사용자가 접근해서는 안 되는 데이터에 접근하거나 수정할 수 있어 심각한 보안 취약점으로 이어질 수 있습니다.
OAuth
OAuth는 애플리케이션이 사용자의 자격 증명을 직접 다루지 않고도 다른 서비스의 사용자 데이터에 접근할 수 있게 해줍니다.
- 사용자는 신뢰할 수 있는 제3자 제공자를 통해 인증합니다.
- 제공자는 애플리케이션에 액세스 토큰을 발급합니다.
- 애플리케이션은 이 토큰을 사용해 사용자 데이터에 안전하게 접근합니다.
상세정보
OAuth는 위임된 접근을 위해 설계된 프로토콜입니다. 여러 애플리케이션과 비밀번호 같은 자격 증명을 공유하는 대신, 사용자는 신뢰할 수 있는 제공자(예: Google)로 인증하고, 제공자는 토큰을 통해 애플리케이션에 제한된 접근 권한을 부여합니다.
일반적인 흐름은 다음과 같습니다: 사용자가 제공자를 통해 로그인하기를 선택하면, 제공자가 사용자를 인증한 뒤 애플리케이션에 액세스 토큰을 발급합니다. 이 토큰은 사용자의 권한을 나타내며, 특정 리소스에 접근하는 데 사용할 수 있습니다.
이 방식은 애플리케이션이 사용자의 실제 자격 증명을 보거나 저장하지 않기 때문에 보안을 향상시킵니다. 또한 애플리케이션이 접근할 수 있는 데이터 범위를 세밀하게 제어할 수 있게 해줍니다.
OAuth는 “Login with Google”, “Login with Facebook” 같은 통합 기능에서 널리 사용되며, 안전한 제3자 인증과 통제된 데이터 공유를 가능하게 합니다.
JSON Web Tokens (JWT)
JWT는 인증된 신원을 담고 있으며, 각 요청과 함께 전송되어 사용자를 검증하는 간결한 토큰입니다.
- 서버는 인증이 성공하면 서명된 JWT를 발급합니다.
- 클라이언트는 토큰을 저장하고, 이후 요청에서 검증을 위해 이를 포함합니다.
- 토큰은 서버 측 세션 저장소 없이 사용자 신원, 권한, 만료 정보를 인코딩합니다.
상세정보
JSON Web Tokens (JWTs)는 상태 비저장(stateless) 시스템에서 인증을 유지하는 일반적인 방법입니다. 사용자가 로그인하면 서버는 JWT를 생성하여 클라이언트에 보냅니다. 그런 다음 클라이언트는 이 토큰을 이후 요청에 포함하며, 일반적으로 HTTP Authorization 헤더에 넣습니다.
JWT에는 사용자 ID, 권한, 만료 시간과 같은 인코딩된 정보가 들어 있습니다. 이 데이터는 서버에 의해 서명되므로, 백엔드는 토큰이 변조되지 않았는지 검증할 수 있습니다.
토큰이 필요한 모든 신원 정보를 담고 있기 때문에, 서버는 각 사용자에 대한 세션 데이터를 저장할 필요가 없습니다. 이로 인해 JWT는 특히 분산 시스템에서 효율적이고 확장성이 좋습니다.
하지만 JWT는 신중하게 다뤄야 합니다. 토큰이 유출되면 만료될 때까지 사용자를 가장하는 데 악용될 수 있습니다. 적절한 만료 설정과 클라이언트 측의 안전한 저장이 매우 중요합니다.
비밀번호 해싱
비밀번호는 해시된 값으로 저장해야 하며, 이렇게 하면 데이터가 노출되더라도 원래 비밀번호를 직접 복구할 수 없습니다.
- 비밀번호는 저장하기 전에 단방향 해시 함수로 변환됩니다.
- 로그인할 때 입력한 비밀번호를 해시하여 저장된 해시와 비교합니다.
- bcrypt, Argon2, PBKDF2 같은 보안 알고리즘은 공격에 견디도록 설계되었습니다.
상세정보
비밀번호를 평문으로 저장하는 것은 심각한 보안 취약점입니다. 데이터베이스가 침해되면 공격자는 즉시 모든 사용자 비밀번호에 접근할 수 있습니다. 이를 방지하기 위해 시스템은 대신 비밀번호의 해시된 버전을 저장합니다.
해시 함수는 입력값(비밀번호)을 받아 고정 길이의 출력값(해시)을 생성합니다. 이 과정은 단방향이므로, 해시를 원래 비밀번호로 되돌리는 것은 계산적으로 사실상 불가능합니다.
사용자가 로그인할 때 시스템은 입력한 비밀번호를 해시한 뒤 저장된 해시와 비교합니다. 일치하면 원래 값을 노출하지 않고도 비밀번호가 올바르다는 것을 확인할 수 있습니다.
bcrypt, Argon2, PBKDF2 같은 최신 해싱 알고리즘은 의도적으로 느리게 설계되었으며, 솔팅(salting) 같은 기능을 포함해 무차별 대입 공격과 사전 계산 공격을 방어합니다. 따라서 기본 해시 함수보다 훨씬 더 안전합니다.
사이트 간 요청 위조(CSRF)
CSRF 공격은 사용자의 인증된 세션을 악용하여, 사용자가 모르는 사이에 의도하지 않은 작업을 수행하게 합니다.
사용자(로그인됨)
브라우저
서버
- 공격자는 로그인한 사용자의 브라우저를 속여 승인되지 않은 요청을 보내게 합니다.
- 서버는 사용자의 세션을 신뢰하기 때문에 요청을 처리합니다.
- 보호는 요청이 신뢰할 수 있는 출처에서 왔는지 검증하는 데 의존합니다.
상세정보
사이트 간 요청 위조(CSRF)는 악성 웹사이트가 사용자의 브라우저로 하여금 사용자가 이미 인증된 다른 사이트에 요청을 보내게 할 때 발생합니다. 브라우저는 세션 쿠키를 자동으로 포함하므로, 서버는 해당 요청이 정상적이라고 가정합니다.
예를 들어, 사용자가 은행 애플리케이션에 로그인한 상태에서 악성 사이트를 방문하면, 그 사이트는 돈을 이체하는 숨겨진 요청을 유발할 수 있습니다. 서버는 유효한 세션을 확인하므로 요청을 처리하지만, 사용자는 그런 작업을 수행할 의도가 없었습니다.
CSRF 공격을 방지하기 위해 시스템은 CSRF 토큰과 same-site cookies 같은 기법을 사용합니다. CSRF 토큰은 요청에 포함되는 고유한 값으로, 서버가 이를 검증하여 요청이 올바른 애플리케이션에서 시작되었는지 확인합니다. same-site cookies는 쿠키가 전송되는 시점을 제한하여 사이트 간 요청의 위험을 줄입니다.
적절한 CSRF 보호가 없으면 공격자는 신뢰된 사용자 세션을 악용하여 사용자 자격 증명에 직접 접근하지 않고도 해로운 작업을 수행할 수 있습니다.
교차 사이트 스크립팅 (XSS)
XSS 공격은 악성 스크립트를 웹 페이지에 주입하여 다른 사용자의 브라우저에서 실행되게 합니다.
- 신뢰할 수 없는 사용자 입력이 브라우저에서 코드로 주입되고 실행될 수 있습니다.
- 공격자는 세션 데이터를 훔치거나 사용자 상호작용을 조작할 수 있습니다.
- 방어를 위해서는 모든 사용자 제공 콘텐츠를 엄격하게 처리해야 합니다.
상세정보
교차 사이트 스크립팅(XSS)은 애플리케이션이 신뢰할 수 없는 사용자 입력을 적절히 검증하거나 이스케이프하지 않은 채 웹 페이지에 포함할 때 발생합니다. 이렇게 되면 공격자는 다른 사용자의 브라우저에서 실행되는 스크립트를 주입할 수 있습니다.
예를 들어, 댓글 필드가 원시 HTML이나 JavaScript를 허용하면 공격자는 다른 사용자가 페이지를 볼 때마다 실행되는 스크립트를 삽입할 수 있습니다. 이 스크립트는 쿠키를 훔치거나, 사용자 입력을 캡처하거나, 사용자를 대신해 작업을 수행할 수 있습니다.
XSS를 방지하려면 시스템은 모든 사용자 입력을 신뢰할 수 없는 것으로 취급해야 합니다. 입력 정제는 잠재적으로 위험한 콘텐츠를 제거하고, 출력 이스케이프는 데이터가 실행 가능한 코드가 아니라 텍스트로 렌더링되도록 보장합니다. 콘텐츠 보안 정책(CSP)은 실행이 허용되는 스크립트를 제한하여 추가적인 보호 계층을 제공합니다.
적절한 방어가 없으면 XSS 취약점은 사용자 계정을 침해하고 애플리케이션 전체의 보안을 약화시킬 수 있습니다.
비밀 관리
비밀 관리는 민감한 자격 증명이 코드나 시스템에 노출되지 않도록 안전하게 저장, 접근, 회전되도록 보장합니다.
- 비밀에는 API 키, 데이터베이스 자격 증명, 암호화 키가 포함됩니다.
- 이들은 절대로 하드코딩되거나 소스 코드에 노출되어서는 안 됩니다.
- 안전한 시스템은 접근을 제어하고 비밀을 정기적으로 회전합니다.
상세정보
백엔드 시스템은 데이터베이스, 외부 서비스, 내부 구성 요소와 통신하기 위해 민감한 자격 증명에 의존합니다. 이러한 비밀에는 API 키, 데이터베이스 비밀번호, 암호화 키가 포함되며, 모두 무단 접근으로부터 보호되어야 합니다.
비밀을 코드나 설정 파일에 직접 저장하는 것은 큰 보안 위험입니다. 코드베이스가 노출되면 포함된 모든 자격 증명이 즉시 유출됩니다. 대신 비밀은 안전한 저장과 통제된 접근을 위해 설계된 전용 시스템에 저장해야 합니다.
AWS Secrets Manager와 HashiCorp Vault 같은 비밀 관리자(secrets manager)는 자격 증명의 중앙 집중식 저장, 접근 제어, 자동 회전을 제공합니다. 환경 변수는 더 단순한 설정에서 때때로 사용되지만, 이 경우에도 신중한 관리가 필요합니다.
적절한 비밀 관리는 자격 증명 유출 위험을 줄이고, 시스템이 민감한 정보를 노출하지 않으면서 필요한 리소스에 안전하게 접근할 수 있도록 보장합니다.
보안 보호로서의 Rate Limiting
Rate limiting은 요청 수를 제한하여 남용과 서비스 거부(DoS) 공격을 방지하는 보안 제어로 작동합니다.
- 클라이언트가 일정 시간 동안 보낼 수 있는 요청 수를 제한합니다.
- 로그인과 API 같은 엔드포인트를 무차별 대입 공격과 남용으로부터 보호합니다.
- 한도를 초과하면 추가 요청은 차단되거나 지연됩니다.
상세정보
Rate limiting은 단순한 성능 도구가 아니라 중요한 보안 메커니즘입니다. 클라이언트가 보낼 수 있는 요청 수를 제어함으로써, 시스템은 무차별 대입 로그인 시도나 서비스 거부 공격과 같은 남용을 방지할 수 있습니다.
예를 들어, 로그인 시도를 제한하면 비밀번호 추측 공격의 효과를 줄일 수 있습니다. 마찬가지로 API 요청 할당량을 적용하면 단일 클라이언트가 백엔드 서비스를 압도하는 것을 막을 수 있습니다.
과정은 간단합니다. 들어오는 요청을 정의된 한도와 비교하고, 임계값을 초과하면 요청을 거부하거나 지연합니다. 이를 통해 공정한 사용을 보장하고 시스템 리소스를 보호할 수 있습니다.
다른 보안 조치와 함께 사용하면 rate limiting은 악성 트래픽과 오용에 대한 시스템의 복원력을 크게 강화합니다.
질문 섹션
1 / 5
이 레슨은 프리미엄 콘텐츠입니다
프리미엄으로 업그레이드하여 흐림 효과를 없애고 전체 내용을 읽어 보세요.