웹 개발에서 보안과 관련된 문제는 여러 가지 문제가 있다.
클라이언트 쪽에 구현된 보안 장치는 쉽게 무력화될 수 있다.
사용자가 개발자가 예상 못 한 패턴으로 사용할 수 있다.
사용자는 반드시 웹 브라우저 만을 사용하지 않는다.
HTML 폼 필드에 보이지 않는 값으로 값을 변조할 수 있다.
HTTP 쿠키 안에 포함되어 전달되는 세션 토큰을 조작할 수 있다.
정상적으로 제공될 특정 값을 제거할 수 있다.
악의적인 쿼리를 강제로 삽입해 입력값을 조작할 수 있다.
보안 문제를 해결하기 위해서는 여러 방법이 존재한다.
SQL Injection 방어
SQL Injection은 데이터베이스를 공격하는 기법 중 하나다. 악의적인 SQL 문을 실행시켜 데이터베이스를 비정상적으로 조작하는 공격 기법이다.
SQL Injection을 방어하기 위해서는 SQL query에 사용되는 문자 및 단어를 전부 필터링하고 에러 메시지가 나오지 않도록 주의해야 한다. 또한 최소 권한 유저로 DB를 운영하는 것도 방어 방법 중 하나다.
TypeORM이나 Sequelize는 쿼리에 사용자 입력을 직접 포함하지 않고 매개변수로 대체하는 방식을 사용해서 기본적으로 SQL Injection을 방어하는 기능을 제공한다.
XSS 방어
XSS(Cross-Site Scripting)는 웹 애플리케이션에서 발생하는 취약점 중 하나다.
해커가 악성 스크립트를 주입하여 사용자의 정보를 탈취하거나 악성 행동을 수행할 수 있다.
XSS 공격은 크게 세 가지 유형으로 나눌 수 있다.
저장형 XSS : 공격자가 악성 스크립트를 데이터베이스에 저장한 후 사용자가 해당 데이터를 요청할 때 발생한다.
반사형 XSS : 공격자가 악성 스크립트를 URL 매개변수 등을 통해 전달하고 사용자가 해당 URL을 클릭할 때 발생한다.
DOM 기반 XSS : 공격자가 악성 스크립트를 DOM에 직접 주입하여 발생한다.
XSS 공격을 방어하기 위해서는 입력값 검증 및 이스케이프 처리(입력값에 포함된 특수문자를 처리하여 악성 스크립트가 실행되지 않도록 방지) 등의 방법으로 방어할 수 있다.
CSRF 방어
CSRF(Cross-Site Request Forgery)는 사용자가 의도하지 않은 요청을 악의적으로 실행시키는 공격이다.
이 공격은 사용자가 인증된 상태로 웹 애플리케이션에서 원하지 않은 작업을 수행하도록 강제하는 것으로 소셜 엔지니어링(이메일이나 채팅을 통해 링크를 보내는 등)을 이용하여 웹 애플리케이션의 사용자를 속여서 공격자가 의도한 작업을 수행하게 만든다.
CSRF 공격을 방어하기 위해서는 CSRF 토큰을 사용하는 방법이 있다.
CSRF 토큰은 서버에서 발급한 랜덤 한 문자열로 사용자가 요청을 보낼 때 함께 전송되어 서버에서 검증한다.
이를 통해 공격자가 CSRF토큰을 알지 못하면 요청을 보낼 수 없으므로 CSRF 공격을 방지할 수 있다.
파일 업로드 방어
파일 업로드 취약점은 웹 애플리케이션에서 파일 업로드 기능을 악의 적인 파일을 업로드하거나 서버의 정보를 탈취하는 공격이다.
파일 업로드 방어는 웹 애플리케이션에서 파일을 업로드할 때 발생할 수 있는 취약점을 방지하기 위한 보안 기술이다. 파일 업로드 방어 기술
- 확장자 검사
- 대소문자 구분하지 않고 확장자 비교
- 특수문자가 포함된 경우 업로드 금지
- 업로드된 파일명 확장자를 난수화하여 변경
- 업로드된 파일을 url요청으로 직접 접근이 불가능한 위치에 저장
세션 관리
세션 하이재킹은 사용자의 세션을 탈취하거나 조작하여 사용자의 권한을 빼앗는 공격이다.
세션 관리는 웹 애플리케이션에서 인증 및 접근 제어의 기반이 된다.
세션 보안을 사용하여 사용자가 로그인한 상태로 컴퓨터 앞을 떠날 경우 네트워크 노출을 차단한다.
세션 관리에서는 세션 ID를 생성하고 이를 쿠키나 URL 매개변수에 저장하여 사용자가 다시 요청할 때마다 세션 ID를 확인하여 세션을 유지한다.
이때 세션 ID는 무작위 생성되어야 하며 예측할 수 없도록 해야 한다.
세션 관리에는 XSS 방어, CSRF 방어 등 다양한 보안 기능이 필요하다.
웹 보안 문제를 최소화하는 방법
입력 값 검증 : 사용자로부터 입력받은 데이터를 검증하여 악의적인 데이터가 주입되지 않도록 한다.
적절한 에러 처리 : 시스템의 에러 메시지가 사용자에게 노출되지 않도록 하고 공격자에게 유용한 정보를 제공하지 않도록 한다.
암호화 : 데이터 전송이나 저장 시 암호화를 적용해야 한다.
접근 제어 : 사용자의 권한에 따라 접근할 수 있는 리소스를 제한한다.
적절한 세션 관리 : 세션을 안전하게 관리하여 세션 하이재킹을 예방한다.
보안 헤더 : 웹 서버에서 보안 관련 헤더를 설정하여 브라우저 통신 중 발생하는 일부 공격을 예방한다.
코딩 실수 방지 : 소스 코드 리뷰를 통해 보안에 영향을 미치는 실수를 발견하고 수정한다.
'과거공부모음' 카테고리의 다른 글
node.js 모듈 시스템 (0) | 2023.04.20 |
---|---|
개발 방법론 (0) | 2023.04.19 |
자료구조 알고리즘 (0) | 2023.04.18 |
데이터베이스와 ORM (0) | 2023.04.18 |
RESTful API (0) | 2023.04.17 |