Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- KDT 프로그래머스 데브코스 프론트엔드
- react customHook 예시
- Vue3 Router
- 프로그래머스 데브코스
- 모던 자바스크립트 Deep Dive
- 머쓱이
- 프로그래머스 K_Digital Training 프론트엔드
- K_Digital Training
- 모던 자바스크립트 TIL
- KDT 프로그래머스
- 백준 node.js
- 우테캠 회고록
- useEffect return
- 프로그래머스 데브코스 프론트엔드
- 백준 js
- 모던 자바스크립트 Deep Dive TIL
- TypeScript 문법 소개
- react 프로젝트 리팩토링
- frontend roadmap study
- 모던 javascript Deep Dive
- 모던 자바스크립트 딥다이브
- Frontend Roadmap
- 인프런 자바스크립트 알고리즘 문제풀이
- useRef 지역 변수
- 투포인터알고리즘 js
- 개발자 특강
- Vue3
- 리팩토링 회고
- 프로그래머스 K_Digital Training
- 프로그래머스 데브코스 프론트엔드 TIL
Archives
- Today
- Total
프론트엔드 개발자의 기록 공간
[FE_Roadmap] Web Security Knowledge 본문
HTTPS
- 월드 와이드 웹에서 정보를 주고 받을 수 있는 프로토콜
- 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜
- HTTP는 암호화하지 않은 평문 데이터 전송이므로,데이터 노출 및 변조의 위험이 있다.
HTTPS
- HTTPS는 TLS/SSL인터넷 암호화 통신 프로토콜을 사용하여 암호화를 통해 평문 데이터 문제 해결한다. (무결성 보장)
- TLS 는 SSL의 업데이트 버전이라고 이해
- 서버에서 HTTPS 프로토콜 사용을 위해 SSL 인증서를 CA기관으로부터 발급 받는다.
- 80번 port를 사용하는 http와 달리 https는 443번 port를 사용한다.
HTTPS 동작 과정
- 클라이언트(브라우저)가 서버로 최초 연결 시도를 함
- 서버는 SSL 인증서를 브라우저에게 넘겨줌
- 브라우저는 인증서의 유효성을 검사하고(CA기관의 공개키로 확인) 세션키를 발급함
- 브라우저는 세션키를 보관하며 추가로 서버의 공개키로 세션키를 암호화하여 서버로 전송함
- 서버는 개인키로 암호화된 세션키를 복호화하여 세션키를 얻음
- 클라이언트와 서버는 동일한 세션키를 공유하므로 데이터를 전달할 때 세션키로 암호화/복호화를 진행함
Content Security Policy
- CSP는 XSS 및 데이터 삽입 공격 을 비롯한 특정 유형의 공격을 감지하고 완화하는 데 도움이 되는 추가 보안 계층이다. 이러한 공격은 데이터 도용에서 사이트 훼손, 맬웨어 배포에 이르기까지 모든 것에 사용된다.
- 스크립트를 실행 가능한 화이트리스트를 만들어 화이트리스트 도메인에서 로드된 스크립트만 실행한다.
- CSP는 스크립트, 스타일 시트, 이미지, 글꼴, 개체, 미디어 (오디오, 비디오), 프레임 및 양식 작업을 포함한 모든 동적 원본에 대해 허용된 원본을 지정할 수 있다.
- CSP 는 Content-Security-Policy HTTP 헤더를 통해 설정된다.
Content-Security-Policy: default-src 'self'; img-src *; media-src example.org example.net; script-src userscripts.example.com
웹 사이트 관리자는 웹 응용 프로그램 사용자가 자신의 콘텐츠에 모든 원본의 이미지를 포함할 수 있도록 허용하지만 오디오 또는 비디오 미디어는 신뢰할 수 있는 공급자로 제한하고 모든 스크립트는 신뢰할 수 있는 코드를 호스팅하는 특정 서버로만 제한하려고 한다.
- 일반적인 CSP는 URL 허용 목록을 기반으로 하기 때문에 우회가 가능하다.
- 엄격한 CSP를 통해 조금 더 안전하게 사용할 수 있다.
- 임시값 기반 CSP : 런타임 시 임의의 숫자를 생성하여 CSP에 포함하고 페이지의 모든 스크립트 태그와 연결한다. 공격자는 해당 스크립트에 대한 올바른 임의의 숫자를 추측해야 하기 때문에 페이지에 악성 스크립트를 포함하고 실행할 수 없습니다. 이것은 숫자를 추측할 수 없고 런타임 시 모든 응답에 대해 새로 생성된 경우에만 작동한다.
- 해시 기반 CSP : 모든 인라인 스크립트 태그의 해시가 CSP에 추가됩니다. 각 스크립트에는 다른 해시가 있습니다. 공격자는 페이지에 악성 스크립트를 포함하고 실행할 수 없습니다. 해당 스크립트의 해시가 CSP에 있어야 하기 때문이다.
CORS(Cross-Origin Resource Sharing)
- 교차 출처 리소스 공유는 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려준다. 웹 애플리케이션은 리소스가 자신의 출처(도메인, 프로토콜, 포트)와 다를 때 교차 출처 HTTP 요청을 실행한다.
- CORS의 에러가 생기는 이유는 SOP를 위반한 에러이다.
- SOP(same-origin policy, 동일 출처 정책) : 출처가 동일한 프로토콜, 포트번호, 도메인에서만 자원을 사용가능 하도록 하는 보안정책이다.
- 즉, CORS 에러는 요청 브라우저에서 다른 도메인(프로토콜, 포트번호)을 가지는 서버로 요청이 갈때 브라우저에서 발생하는 보안정책이다.
- CSRF(사이트 간 요청 위조), XSS(교차 사이트 스크립팅)을 보안할 수 있다.
CORS를 사용하는 요청
- XMLHttpRequest 또는 Fetch API
- 웹 글꼴 (@font-face)
- WebGL (Web Graphics Library)
- 캔버스에 그린 이미지/비디오 프레임 (drawImage())
- 이미지의 CSS 모양 (CSS Shapes from images)
CORS 원리
- 단순 요청(Simple requests)
- 단순 요청은 서버에 API를 요청하면 서버는 Access-Control-Allow-Origin 헤더를 포함한 응답을 브라우저에 보낸다. 브라우저는 Access-Control-Allow-Origin 헤더를 확인해서 CORS 동작을 처리한다.
- 요청 메서드(method)는 GET, HEAD, POST 만 가능하다.
- Accept, Accept-Language, Content-Language, Content-Type를 제외한 헤더를 사용하면 안 됩니다.
- Content-Type 헤더는 application/x-www-form-urlencoded, multipart/form-data, text/plain 만 가능하다.
- 프리플라이트 요청(preflighted)
- Preflight 요청은 서버에 예비 요청을 보내서 안전한지 판단한 후 본 요청을 보내는 방법이다
- 먼저 OPTIONS 메서드를 통해 다른 도메인의 리소스로 HTTP 요청을 보내 실제 요청이 전송하기에 안전한지 확인 합니다. cross-origin 요청은 유저 데이터에 영향을 줄 수 있기 때문에 이와같이 미리 전송한다.
OWASP Security Risks
- OWASP(The Open Web Application Security Project)는 오픈소스 웹 애플리케이션 보안 프로젝트이다. 주로 웹에 관한 정보노출, 악성 파일 및 스크립트, 보안 취약점 등을 연구하여 웹 애플리케이션 취약점 중에서 빈도가 많이 발생하고, 보안상 영향을 크게 줄 수 있는 것들 10가지를 선정한다.
2017 기준 10가지 종류
- Injection
- Broken authentication
- Sensitive data exposure
- XML external entities (XXE)
- Broken access control
- Security misconfigurations
- Cross site scripting (XSS)
- Insecure deserialization
- Using components with known vulnerabilities
- Insufficient logging and monitoring
클라이언트 측 보안 방법
- innerHTML 대신 innerText 사용
- innerHTML 속성은 문자열 자체를 수정할 수 있기 때문에, 악의를 가진 해커가 script 태그를 사용해 JavaScript 코드를 작성한 뒤 실행되도록 만들 수 있다.
- HTML5에서 innerHTML과 함께 삽입된 script 태그가 실행되지 않도록 지정했지만, 우회가 가능하다.
- eval() 함수 사용 x
console.log(eval('2 + 2')); // Expected output: 4
- eval()은 인자로 받은 코드를 caller의 권한으로 수행하는 위험한 함수입니다. 악의적인 영향을 받았을 수 있는 문자열을 eval()로 실행한다면, 당신의 웹페이지나 확장 프로그램의 권한으로 사용자의 기기에서 악의적인 코드를 수행하는 결과를 초래할 수 있습니다.
- XML 또는 JSON을 동적으로 작성 x
- 클라이언트에 의존 x (사용자가 클라이언트측 로직을 제어할 수 있음. 우회하거나 코드 중단점 설정, 플러그인 등을 통해 제어가능)
- 클라이언트에 중요한 정보 보관 x
- 클라이언트에서 암호화 수행 x
- ...
https
cors
csp
OWASP
728x90
'개발지식' 카테고리의 다른 글
[FE_Roadmap] CSS Architecture&CSS Preprocessors (1) | 2023.12.17 |
---|---|
[FE_Roadmap] Package Managers (0) | 2023.12.09 |
[React 무한 스크롤 구현하기] (feat. typeScript, useHook) (4) | 2022.10.22 |
React testing library + MSW 기본 사용법 (0) | 2022.08.15 |
아토믹 디자인(Atomic Design) 소개 및 실제 사용 경험 (0) | 2022.04.19 |
Comments