XSS (Cross Site Scripting)
- 공격자가 악성 스크립트를 웹사이트에 삽입하여 사용자에게 실행시키는 공격
- 주로 사용자의 권한 및 토큰 탈취 목적
- 사용자가 특정 사이트를 신뢰한다는 사실을 이용한 공격 방식
공격 예시
Reflected XSS (반사형)
- 공격자가 악성 스크립트를 포함하는 url 을 만들고 사용자에게 전송한다.
- 사용자가 url 을 클릭하면 악성 스크립트가 실행되어 사용자 정보가 탈취된다.
Stored XSS (저장형)
- 공격자가 악성 스크립트를 웹사이트의 데이터베이스에 저장한다.
- 사용자가 웹사이트에 방문하면 악성 스크립트가 실행되어 사용자 정보가 탈취된다.
- 예시
- 공격자가 악성 스크립트를 포함하는 댓글을 게시판에 올린다.
- 사용자가 댓글을 볼 때 악성 스크립트가 실행되어 사용자의 정보를 탈취하거나 쿠키를 도용한다.
공격 방지 방법
- 사용자의 입력값을 검증하여 악성 스크립트가 포함되지 않도록 한다.
- 웹사이트에 출력되는 값을 인코딩하여 악성 스크립트가 실행되지 않도록 한다.
- HTTP Content-Security-Policy 헤더 설정을 함으로서 웹사이트에서 허용되는 콘텐츠 소스를 제어한다.
- HttpOnly 설정으로 JavaScript를 통해 쿠키에 접근하는 것을 방지한다.
CSRF(Cross-Site Request Forgery)
- 인증된 사용자가 자신의 의지와는 무관하게 악의적인 요청을 보내도록 하는 공격 방식
- 공격자는 사용자가 이미 로그인한 웹사이트에 악의적인 요청을 포함하는 링크 또는 이미지를 삽입하고, 사용자가 해당 링크를 클릭하거나 이미지를 보면 악의적인 요청이 실행된다.
공격 예시
- 은행 송금
- 공격자가 사용자에게 “환불 요청” 이라는 제목의 이메일을 보낸다.
- 이메일에는 악의적인 링크가 포함되어 있고, 사용자가 링크를 클릭하면 공격자의 계좌로 돈이 송금된다.
- 쇼핑몰 구매
- 공격자가 온라인 커뮤니티에 “저렴한 상품 판매” 라는 제목의 게시글을 작성한다.
- 게시글에는 악의적인 링크가 포함되어 있고, 사용자가 링크를 클릭하면 사용자의 의도와 상관없이 상품이 구매된다.
- SNS 게시물 작성
- 공격자가 사용자에게 메시지를 보낸다.
- 메시지에는 악의적인 링크가 포함되어 있으며, 사용자가 링크를 클릭하면 공격자의 의도와 상관없이 SNS 게시물이 작성된다.
공격 방지 방법
- CSRF 토큰 사용: 사용자 요청에 CSRF 토큰을 포함하여 공격자의 악의적인 요청을 차단한다.
- 웹 서버는 사용자 로그인 시 임의의 값을 생성하여 csrf 토큰으로 사용한다.
- csrf 토큰은 사용자 세션에 저장하거나 쿠키로 전송한다.
- 사용자가 웹사이트에 요청을 보낼 때, 매 요청마다 csrf 토큰을 포함시킨다.
- 웹 서버는 요청에 포함된 csrf 토큰을 검증한다.
- HTTP Referer 헤더 검증: 사용자 요청의 Referer 헤더를 검증하여 요청 출처가 유효한지 확인한다.
- SameSite 쿠키 설정: 다른 도메인으로의 쿠키 전송을 제한하여 공격자가 다른 웹사이트에서 사용자의 쿠키를 사용하지 못하도록 한다.
SameSite
- SameSite 쿠키는 CSRF 공격을 방지하기 위한 쿠키 속성이다.
- SameSite 쿠키는 브라우저가 쿠키를 요청하는 사이트와 일치하는 사이트에서만 전송하도록 지시한다.
SameSite 속성
-
Lax: 쿠키는 요청 사이트와 동일한 사이트 또는 상위 사이트에서만 전송된다. 예를 들어, example.com에서 설정된 쿠키는 subdomain.example.com에서도 사용할 수 있지만 otherdomain.com에서는 사용할 수 없다.
-
Strict: 쿠키는 요청 사이트에서만 전송된다. example.com에서 설정된 쿠키는 subdomain.example.com에서도 사용할 수 없다.
-
None: 쿠키는 모든 사이트에서 전송된다. 보안 위험이 있으므로 주의해서 사용해야 한다.
samesite 쿠키 설정 방법
JavaScript 예시
document.cookie = "session=value; SameSite=Lax";
Go 예시
package main
import (
"fmt"
"net/http"
)
func main() {
cookie := &http.Cookie{
Name: "session",
Value: "session-value",
SameSite: http.SameSiteLaxMode,
}
http.SetCookie(w, cookie)
}
reference
정보보안