Appearance
글: 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를 노출하는 것은 공격자에게 앱 구조에 대한 인사이트를 줄 수 있음