개발

AngularJs 보안 가이드

snow-line 2020. 7. 28. 22:25
반응형

AngularJs 보안 가이드에는 4가지 항목에 대해 설명합니다.

 

1. 데이터와 HTML에 대한 인증되지 않은 접근 방어

2. 스누핑 방어를 위한 연결 암호화

3. 크로스사이트 스크립팅(XSS) 공격 및 크로스 사이트 요청 위조(XSRF) 방어

4. JSON 주입 취약점 방어

 

1. 인증되지 않은 접근 처리 (Cross-site request forgery - CSRF)

 

- 인증되지 않은 사용자가 DB에 get 이외의 요청을 보내는 경우

- 관리자가 아닌 사용자가 프로젝트나 사용자 DB에 대해 get 이외의 요청을 보내는 경우

 

위와 같은 경우 401 에러를 발생시켜야 합니다.

POST / login - post 요청의 body를 기준으로 사용자 인증

POST / logout - 인증 쿠키 삭제함으로써 현재 사용자를 로그아웃 한다.

GET / current-user - 현재 사용자의 세부 정보를 받아온다.

사용자가 권한을 갖고 있지 않을 때 AngularJs의 경로 시스템(ui-router)을 통해 특정 파셜 템플릿(HTML)에 접근 불가능하게 해야 합니다.

 

서버에서 다음과 같은 HTTP 헤더를 보내면 방어가 가능합니다.

Cache-Control : no-cache, no-store, must-revalidate

Pragma : no-cache

Expires : 0

AngularJs는 $templateCache 서비스로 모든 템플릿을 캐싱한다. 우연하게 다른 사용자가 캐싱된 템플릿을 볼 수 있으므로 로그아웃 시 브라우저 새로고침을 통해 AngularJs 서비스가 캐싱했던 모든 데이터를 지워야 합니다.

 

2. 쿠키 스누핑 방지

스누핑 공격을 막는 가장 간단한 방법은 HTTPS를 사용하는 것입니다.

추가로 클라이언트에서 서버로 인증 쿠키 요청은 HTTPS로만 제한해야 하며, 서버에서 쿠키를 만들 때 httpOnly와 secure옵션을 true로 설정해야 합니다.

 

3. 크로스사이트 스크립팅 방지

- 웹 페이지에 클라이언트 측 스크립트를 주입하는 공격으로 주입한 스크립트가 서버로 요청을 보내는 경우 문제가 더욱 심각해집니다.

- XSS(크로스사이트 스크립팅 공격)는 가장 흔하게 악의적인 HTML 폼이 렌더링 되는걸 막지 않은 채 사용자가 입력한 내용을 그대로 표시하는 경우입니다.

- 이러한 공격을 막기 위해서는 아래와 같은 조치가 취해져야 합니다.

사용자가 입력한 내용을 저장하거나 클라이언트로 다시 보내기 전에 반드시 서버에서 위험한 부분을 제거

* 입력되는 HTML을 신뢰할 수 있을 경우 > ng-bind-html-unsafe 디렉티브 사용

* 입력되는 HTML을 신뢰할 수 없는 경우 > ngSanitize모듈 로딩 후 ng-bind-html 디렉티브 사용

 

4. JSON 주입 취약점 방지

$http 서비스를 사용하면 JSON 주입 공격을 방지합니다.

 

5. 크로스사이트 요청 위조 공격 방지

- 서버에서 사용자를 신뢰하는 경우, 즉 로그인을 한 다음에는 서버에서의 동작이 신뢰를 기반으로 동작하는 애플리케이션이라면 특정 사용자로 가장해서 해당 권한을 악용하는 방법입니다.

- 주로 보안이 필요한 사이트에 로그인한 채로 <img> 태그의 src속성에 공격을 위한 설정을 해둔 페이지를 무심코 다시 로드하는 형태로 이뤄진다. 브라우저가 이미지를 로드하려고 시도하지만 실제로는 보안이 필요한 사이트로 요청을 보냅니다.

<img src="http://my.securesite.com/createAdminUser?username=badguy">

- 크로스사이트 요청 위조 공격 방지를 방어하기 위해서는 아래와 같은 조치가 취해져야 합니다.

서버가 비밀 키를 브라우저에 하나 제공해주고 현재 브라우저에서 실행 중인 자바스크립트만 접근 할 수 있게 처리해야 합니다.

- $http 서비스는 XSRF 공격을 막기 위해 이런 방식을 기본으로 제공합니다.

- 서버는 애플리케이션이 처음으로 보내는 GET 요청에 대해 세션 쿠키 안에 XSRF-TOKEN이라는 이름의 토큰을 설정해줘야 합니다.

반응형

'개발' 카테고리의 다른 글

Centos7 jdk 1.8 설치  (0) 2020.08.10
리눅스 mysql(5.5.9) 설치 방법  (0) 2020.08.08
AngularJs 성능 개선 가이드  (0) 2020.07.28
Redis 튜닝하기  (0) 2020.07.27
프리랜서 계약서 양식  (0) 2020.07.27