CSRF (Cross Site Request Forgery)
CSRF는 웹 어플리케이션 취약점 중 하나로, 공격자가 특정 웹사이트에 사용자의 의지와 무관하게 특정한 행위를 요청하도록 만드는 공격이다. 이러한 공격을 통해 공격자는 사용자의 권한을 도용하여 중요한 기능을 실행할 수 있다.
CSRF 공격 순서
- 공격자의 스크립트가 포함된 게시물 : 공격자는 악의적인 스크립트가 포함된 게시물을 작성하거나 게시판, 이메일 등을 통해 다른 사용자에게 전송한다. 이 스크립트는 공격을 실행할 수 있는 요청을 트리거하는 역할을 한다.
- 사용자의 확인 : 이 게시물을 사용자가 확인한다. 이때, 사용자는 악의적인 스크립트가 포함된 게시물을 열람하게 된다.
- CSRF 스크립트 실행 : 악의적인 스크립트가 열린 순간, 스크립트는 사용자의 브라우저에서 특정 웹 어플리케이션에 비인가된 요청을 보낸다. 이 요청은 사용자의 세션 정보를 이용하여 원하는 작업을 수행하려 시도한다.
- 사용자 피해 : 스크립트가 성공적으로 실행되면, 관리자 또는 사용자의 권한으로 원치 않는 작업이 수행됩니다. 이로 인해 데이터 손실, 권한 부정 사용, 불법 트랜잭션 등의 피해가 발생할 수 있다.
CSRF 방어 및 예방 방법
- 토큰 사용
- 서버에서 모든 중요한 요청에 대한 토큰을 생성하고 확인한다. 이 토큰은 세션과 연결되어 있으며, 요청 마다 변경된다. 공격자가 희생자의 토큰을 알아내더라도, 이 토큰은 유효하지 않으므로 공격이 실패한다.
- 서버에서 모든 중요한 요청에 대한 토큰을 생성하고 확인한다. 이 토큰은 세션과 연결되어 있으며, 요청 마다 변경된다. 공격자가 희생자의 토큰을 알아내더라도, 이 토큰은 유효하지 않으므로 공격이 실패한다.
- Referer/Origin 검사
- HTTP 헤더에 있는 Referer 또는 Origin을 검사하여 요청이 유효한 출처에서 온 것인지 확인할 수 있다.
- HTTP 헤더에 있는 Referer 또는 Origin을 검사하여 요청이 유효한 출처에서 온 것인지 확인할 수 있다.
- HTTP 메서드 검증
- 특정 HTTP 메서드를 사용하였을 때만 작업을 수행하는 요청을 허용하고 다른 메서드에 대해서는 요청을 거부할 수 있다.
- 특정 HTTP 메서드를 사용하였을 때만 작업을 수행하는 요청을 허용하고 다른 메서드에 대해서는 요청을 거부할 수 있다.
- 로그아웃 시간 설정
- 사용자의 로그인 세션을 일정 시간 후에 자동으로 만료시켜, 공격자가 세션을 오랫동안 이용할 기회를 줄일 수 있다.
XSS (Cross Site Scription)
XSS는 공격자가 악의적인 스크립트를 삽입하여 다른 사용자의 브라우저에서 실행되게 하는 공격이다. 주로 웹 페이지에 사용자가 입력한 데이터를 적절하게 검증 또는 이스케이프하지 않을 때 발생한다.
XSS 공격 종류
1. Reflected XSS
- 공격자가 악성 스크립트가 담긴 URL을 만들어 일반 사용자에게 전달하고, 링크를 클릭하면 URL 주소 뒤에 붙는 쿼리에 악성 스크립트를 작성해서 전달하는 공격
- 주로 검색 엔진 등을 통해 사용자가 입력한 쿼리를 동적으로 웹 페이지에 표시할 때 발생할 수 있다.
2. DOM Based XSS
- 보안에 취약한 JavaScript 코드로 DOM 객체를 제어하는 과정에서 발생
- 클라이언트 측 스크립트와 관련된 공격으로, 서버가 아닌 클라이언트 측에서 발생
- 악성 스크립트가 실행되도록 되어있는 URL 주소를 클릭하면 서버로부터 HTML 문서를 전달받고, 사용자의 브라우저가 응답 받은 HTML 문서를 읽으면서 필요한 스크립트를 실행하는 중에 악성 스크립트가 동작한다.
3. Persistent(Stored) XSS
- 공격자가 서버에 악성 스크립트를 저장함으로써 발생
- 비정상적인 방법이 아니라 서버에서 제공하는 게시판, 사용자 프로필에 악의적으로 동작하는 스크립트가 그대로 저장된 후 클라이언트의 브라우저로 전달되어 문제가 발생
XSS 방어 및 예방 방법
1. 입력 값 제한
브라우저에서 사용자 입력 시 정규식을 통해 특수 문자를 제한한다.
2. 입력 값 치환
악성 스크립트를 만들 수 있는 특수 문자들을 치환한다. 모든 요청에 대해 치환을 적용할 수 있도록 필터를 만들어 이를 적용한다.
3. 직접 출력 금지
사용자의 입력을 그대로 출력하지 않고 라이브러리의 출력 함수를 사용한다. JSP 프레임워크에서 사용하는 JSTL 라이브러리의 출력 태그(<c:out />)를 사용하면 문자열을 그대로 출력하고, 이로 인해 스크립트가 실행되지 않으므로 XSS 공격을 방어할 수 있다.
4. XSS 방어 라이브러리 및 확장 앱 사용
Anti XSS 라이브러리를 서버에서 추가하며, 사용자들은 브라우저에서 악성 스크립트가 실행되지 않도록 확장앱을 설치하여 방어할 수 있다.
5. 웹 방화벽
웹 방화벽은 다양한 종류의 웹 공격을 탐지하고 차단하는 역할을 한다.
6. CORS, SOP 설정
CORS 및 SOP 설정을 사용하여 리소스의 출처를 제한할 수 있다. SOP는 동일 출처를 가진 리소스만 로드되도록 제한하며, CORS는 서로 다른 출처 간에 리소스를 공유할 때 사용된다.
SOP (Same Origin Policy)
웹 보안을 강화하기 위한 브라우저의 핵심 보안 원칙 중 하나이다. SOP는 다른 출처(origin)에서 로드된 리소스와 현재 웹 페이지의 리소스 간에 상호 작용을 제한한다. 출처는 웹 리소스의 프로토콜, 호스트, 포트를 기반으로 식별된다.
CORS (Cross Origin Resource Sharing)
CORS는 SOP의 제약을 풀어, 서로 다른 출처에서 리소스를 공유할 수 있도록 하는 메커니즘이다. 웹 애플리케이션은 CORS를 사용하여 다른 도메인에서 리소스에 접근하고 API를 호출할 수 있다.
[참고] https://gyoogle.dev/blog/web-knowledge/CSRF%20&%20XSS.html
https://junhyunny.github.io/information/security/spring-mvc/reflected-cross-site-scripting/
https://junhyunny.github.io/information/security/dom-based-cross-site-scripting/
'Computer Science > Web' 카테고리의 다른 글
[Web] 네이티브 앱 & 웹 앱 & 하이브리드 앱 (0) | 2023.09.07 |
---|---|
[Web] CSR & SSR (0) | 2023.09.07 |
[Web] Logging Level (0) | 2023.08.31 |
[Web] 인증 방식 (0) | 2023.08.31 |
[Web] JWT (JSON Web Token) (0) | 2023.08.31 |