CSRF나 XSS 공격을 막는 방법은?
Last updated
Last updated
XSS는 사용자의 브라우저를 대상으로 악성 스크립트를 삽입하는 공격입니다. 공격자가 취약한 웹사이트에 스크립트를 삽입하고, 이를 통해 사용자의 브라우저에서 악성 코드가 실행됩니다.
목표는 사용자의 개인정보탈취, 또는 피싱이나 사기사이트로의 리다이렉션입니다.
CSRF는 사용자의 신뢰를 악용하여 사용자가 의도하지 않은 요청을 실행시키는 공격입니다. 공격자가 로그인된 사용자의 권한을 도용하여 비정상적인 동작을 유도합니다.
공격방식에도 차이가 있는데요
XSS는 악성 스크립트가 웹 애플리케이션의 취약점을 통해 삽입됩니다. 피해자는 악성 스크립트가 포함된 페이지를 열람하면서 피해를 입습니다. 이를 막기 위해선 중요한 정보는 쿠키 대신 서버에 저장하고, 쿠키에는 httpOnly 속성을 설정하며, url 인코딩이나 문자열을 치환하여 방지합니다.
CSRF의 경우 공격자가 사용자를 속여 특정 요청을 수행하도록 유도합니다 사용자는 정상적인 웹사이트에 로깅ㄴ된 상태로, 공격자의 의도된 요청을 서버에 전달합니다. 이를 방지하기 위해서는 서버측에서 요청 헤더의 도메인과 일치하는지 refferer 속성을 검증하고, 같은 도메인에서의 요청이 아니라면 차단합니다.
또 CSRF 토큰을 사용해 랜덤한 UUID와 같은 임의의 난수를 세선에 저장해두고, 해당 난수가 전달되지 않으면 요청을 거부합니다.
CSRF란, Cross Site Request Forgery의 약자로, 사이트간 위조 요청을 뜻합니다. CSRF는 특정 사이트가 사용자를 신뢰하기 때문에 발생하는 문제입니다.
예시
침입자는 서버로 넘어가는 자금 전송에 대한 요청을 조작하려고 합니다
침입자는 하이퍼링크에 자금 전송 요청에 대한 스크립트를 삽입하고 사이트에 로그인할 사람들에게 전송합니다.
사용자가 링크를 누르면, 의도치 않게 서버로 자금 전송 요청을 보냅니다.
서버는 로그인된 사용자의 요청이기 떄문에 정상적으로 인식하고 전송을 실행하여 침입자에게 돈이 송금됩니다.
CSRF의 조건
쿠키 기반의 서버 세션 정보를 획득할 수 있어야 합니다.
공격자는 서버를 공격하기 위한 요청 방법에 대해 미리 파악하고 있어야 합니다.
예상하지 못한 요청 매개변수가 없어야 합니다.
대응 방안
요청 헤더의 도메인과 일치하는지 refferer 속성을 검증하여 같은 도메인에서의 요청이 아니라면 차단합니다.
CSRF Token을 사용해 랜덤한 UUID와 같은 임의의 난수를 세션에 저장해두고 해당 난수가 전달되지 않으면 요청을 거부합니다.
Security Token 사용
사용자 세션에 암호화된 값을 저장하고 사용자의 요청마다 해당 암호화된 값을 포함시켜 전송합니다.
이후 서버에서 요청을 받을 때마다 세션에 저장된 토큰 값과 요청에 전달되는 토큰 값이 일치하는지 확인합니다.
XSS란 Cross-Site Scripting으로 웹사이트에서 의도치 않은 스크립트를 넣어서 실행시키는 기법을 이야기합니다.
(여담으로 원래 Cross-site Scripting을 줄으면 CSS인데, 이는 다른 CSS(Cascading Style Sheets)와 혼란을 피하고자 Cross를 X로 줄였다고 합니다)
웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 발생하며, 결과로 사용자는 의도치 않은 동작을 수행하거나 쿠키, 세션 등의 정보를 탈취 당하게 됩니다.
예시
제 3의 침입자는 사이트의 취약점을 찾습니다.
취약점을 찾아 세션 쿠키를 탈취하는 스크립트를 사이트에 삽입합니다.
사용자가 웹 사이트에 접근할때 마다 스크립트는 작동되고, 작동된 스크립트를 통해 사용자의 세션 쿠키를 탈취합니다.
대응 방안
중요한 정보는 쿠키 대신 서버에 저장한다.
정보를 암호화한다.
httpOnly 옵션을 설정한다.
Url encoding이나 문자열을 치환한다.