Skip to content

Javascript Security Best Pratices

글: Javascript Security Best Pratices

  • Javscript는 널리 쓰이고, 클라이언트 단에서 동작하기 때문에 악의적인 공격에게 매력적인 목표가 됨
  • Javascript 보안 모범 사례를 소개함

Javascript 취약점

1. Cross-Site Scripting (XSS)

  • 가장 흔한 취약점들 중 하나
  • 악의적인 스크립트를 삽입함
  • 세션 쿠키를 훔치고, 의도하지 않은 동작을 하거나 피시 사이트로 이동시킬 수 있음

Example

html
<script>
  alert("메롱");
</script>
  • 공격자는 이렇게 스크립트를 중간에 넣음

실제 사례

  • 2014년, eBay는 상품 리스트에서 XSS 공격을 당함

2. Cross-Site Request Forgery (CSRF)

  • 인증된 사용자가 원하지 않는 요청을 하도록 만들고, 자격 증명을 악용함

Example

html
<img src="https://yourbank.com/transfer?amount=1000&to=attacker_account" />
  • img 태그가 실행될 때 다른 사이트에서 은행 웹에 로그인이 되어있다면 자금이 이체될 수 있음

3. Insecure Direct Object References (IDOR)

  • user id나 파일 이름 같은 개체 식별자가 노출되면 공격자는 값을 조작하여 볼 수 없는 데이터에 접근할 수 있음

Example

js
fetch("/download?fileId=1234");

접근 제어가 없다면 공격자는 fileId를 바꿔가면 다른 파일에 접근할 수 있음

4. Sensitive Data Exposure

  • 토큰, 자격 증명과 같은 민감한 데이터를 클라이언트에서 실행되는 Javascript에 저장하면 유출될 수 있음

5. Use of Vulnerable Components

  • 보안 취약점이 있는 라이브러리나 컴포넌트를 사용하면 위험을 초래할 수 있음

Javascript 보안 개발 모범사례

1. InputValidataion and Sanitization

  • 유저 입력을 절대 믿으면 안됨
  • validate, sanitize를 클라이언트와 서버 둘다 해야함

2. Secure DOM Manipulation

  • innerHTML과 같은 직접적인 dom 조작을 피해야함
  • textContent, createTextNode와 같은 API들을 사용해야함

3. Avoid Dangerous Functions (eval, Function, etc.)

eval() is evil

  • 임의의 코드를 실행할 수 있는 api를 사용해서는 안됨, 공격의 열린 문

4. Use Strict Mode

  • Javascript의 strict mode는 안전하고 강력하게 만듦

5. Handle Errors Gracefully

  • 에러 메세지에 stack traces나 민감한 데이터를 노출하면 안됨

6. Implement Content Security Policy (CSP)

http
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none';

7. Set HTTP Security Headers

http
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer

8. Dependency Management and Vulnerabillity Scanning

  • npm audit이나 yarn audit을 사용하여 모듈의 취약점을 검사
    • npm v6이 나오면서 v5.10.0 부터 추가됨

9. Protect APIs and Endpoints

  • OAuth, JWT를 쓰기
  • server side에서 validation을 강제하기
  • rate-limit에 민감한 API로 만들기

10. Secure Local Storage Usage

  • 민감한 정보를 절대 localStorage, sessionStorage, secure flag 없는 cookies에 저장하지 않기

11. Use Modern Javascript Features Cautiously

  • 최신 기술은 신중하게 사용하기: Service Workers, WebAssembly, WebRTC …

개발자들이 만드는 흔한 실수

  • client-side validation 우회하는 경우 무시
    • client-side validation은 쉽게 우회할 수 있음
    • 항상 server에서 validate 해야함
  • 3rd-party 라이브러리를 맹신하는 것
    • 유명하다고 안전한 것은 아님
  • 에러 메시지를 노출하는 것
    • stack traces를 노출하는 것은 공격자에게 앱 구조에 대한 인사이트를 줄 수 있음