[WEB] 프론트엔드 기초(3) - XSS공격 개념과 React에서 대응 방법
June 22, 2021
Byeong Chan

XSS(Cross-Site Script)

​ 크로스 사이트 스크립트의 취약성은 해커가 사용자 브라우저를 컨트롤 할 수 있게 하는 해킹 기법 중 하나 입니다. 브라우저 안에 있는 민감한 개인정보, 계좌정보, 휴대전화번호 등이 해킹당할 수 있습니다. 모던 프레임워크에서는 XSS에 대응하는 방어소스가 구현되어있다고는 하지만 신뢰성이 떨어집니다. ​ XSS는 해커가 위험성있는 데이터를 사용자 브라우저 안에 주입시킬 수 있습니다. 그 주입된 데이터는 현재 페이지의 코드를 해석하고 완전한 제어권을 갖게될 수 있습니다. ​

<div id="messageContainer"></div> <script> $("#messageContainer").append(myMessage); </script>

​ HTML은 <script>태그를 안에 집어 넣기만 하면 일단 동작이 됩니다. 외부에서 <script>태그가 포함된 문자열을 주입 시키면 script 코드가 실행됩니다. 이러한 방식으로 사용자 브라우저의 민감성 정보를 가져올 수 있습니다. ​ XSS를 막기위한 가장 좋은 방법은 script가 주입되지 않도록 막는 것 입니다. 이것을 위한 방법중 하나는 상황에 맞는 출력 인코딩을 적용하는 것입니다. 인코딩을 하는 동안 위해성 있는 코드를 안정성 있는 코드로 변환할 수 있습니다. ​

XSS 공격법

script 태그 주입

위에서 언급한대로 script 태그 안에 Javascript 소스를 넣어 제어권을 얻는 것을 말합니다. script를 넣음으로써 현재 페이지에 대한 코드를 제어할 수 있게되며, 민감한 정보를 탈취할 수 있습니다. ​

링크 태그로 접근

<a href="javascript:console.log(`hello, xss`)">

링크 태그 안에 javascript를 주입하여 해당 이벤트가 발생 할 때, 함수를 실행시킬 수 있습니다. 이러한 방식으로 XSS공격을 할 수 있습니다.

이외 다양한 기법으로 자바스크립트 코드를 제어해서 사용자의 정보를 가져옵니다. 이러한 공격 방식을 XSS라고 합니다.

React는 자동 이스케이프를 적용합니다.

​ 일반적인 웹소스에서는 XSS에 취약할 수 있지만, React는 React API를 통해 새로운 요소를 생성할 때 React는 잠재적으로 XSS위 위험성을 인식합니다. 자동적으로 페이지의 마지막 부분에 XSS공격을 유발하지 않도록 막습니다. ​ React는 위험한 데이터가 올라가기 전에 인코딩하여 페이지에 접근하지 못하도록 합니다. 이러한 인코딩방식은 XSS 공격에 대한 기본적인 대응 방법입니다. ​ React에서 컴포넌트간 props를 넘겨줄 때, props는 보호된 상태로 넘겨줍니다. XSS공격으로 오브젝트 내 변수 및 속성을 변경시키려고 할때, React는 그것을 감지하고, input되는 것을 거부합니다. ​

let color = 'red; background-color: blue;' return React.createElement("p", { style: { color: color }}, 'blue!' );

​ 위 코드는 React.createElement()를 사용해서 DOM을 생성하고 동시에 CSS를 변경하려고 하는 소스입니다. ​ 하지만, 위 코드는 에러가 발생합니다. props에 대한 오브젝트 변경되는 것을 보호하기 위해 렌더링된 후 createElement()에 의한 접근은 허용하지 않는다. ​

JSX 방어

​ React에서 부모 컴포넌트로 부터 받은 데이터를 자식 컴포넌트가 바인딩 할 때, 바인딩 되는 데이터가 XSS에 취향성에 노출 될 수 있습니다. 하지만, React에서는 기본적으로 넘겨주고 받는 데이터를 인코딩하여 위험성있는 데이터로 변환되는 것을 막습니다. ​

return ( <p>{ review }</p> );

​ 컴포넌트가 렌더링 될 때, review에 할당 된 데이터는 p 태그안에 존재한다. 오토 이스케이핑 기능에 의해 위험성 있는 코드로 변환되는 것을 막는다. 심지어 데이터를 변환시켰다 해도 React에서 리렌더링 되는 것을 막아 정보를 노출시키지 않는다.​ ​ ​ ​ ​

Comment