이춘혁
프로그래밍 언어와 자연어 모두 관심이 많은 개발자다. 고려대학교에서 한문학을 전공하며 자연스레 중국어와 일본어를 익히게 되었다. 중국, 스페인, 일본 등에서 생활하며 다양한 문화와 외국어를 접했고, 공부에 매진해 영어/중국어/일본어/스페인어를 이해하고 구사할 수 있는 수준이 되었다. 일본에서 웹과 ADAS 개발 업무를 담당하였으며, 현재는 한국비건인증원에서 웹 시스템 개발자로 일하고 있다. 신기술과 최적화에 관심이 많으며, ‘젊음을 값진 모험과 바꾸자’는 마음으로 다양한 경험을 하고, 개발에 있어서는 한 우물을 깊이 그리고 효율적으로 파기 위해 노력 중이다.
옮긴이 머리말 ix
베타리더 후기 xi
머리말 xiii
감사의 말 xvi
CHAPTER 1 웹 보안의 개요 1
1.1 보안 대책이 필요한 이유 1
__1.1.1 취약성은 왜 발생할까? 1
__1.1.2 비기능 요건의 중요성 2
1.2 웹 취약성의 종류와 동향 3
__1.2.1 보안 지침에서 확인하는 취약성의 종류와 동향 4
__1.2.2 보안 관련 정보 수집 6
COLUMN 기업이 취약성에 대처하는 방법 6
마무리 7
CHAPTER 2 실습 준비 9
2.1 준비 전 9
__2.1.1 실습 추천 환경 9
__2.1.2 실습에서 사용하는 소프트웨어 9
2.2 Node.js 설정하기 11
__2.2.1 Node.js 설치하기 11
__2.2.2 Node.js 설치 확인하기 12
__2.2.3 npm 설치 확인하기 12
2.3 Node.js + Express를 사용한 HTTP 서버 구축하기 13
__2.3.1 실습 준비와 Express 설치하기 13
__2.3.2 Node.js + Express로 HTTP 서버 구축하기 14
__2.3.3 정적 파일 전달하기 17
__2.3.4 호스트명을 임의로 설정해 로컬 HTTP 서버에 접속하기 18
COLUMN CommonJS와 ECMAScript Modules 19
마무리 19
CHAPTER 3 HTTP 21
3.1 HTTP 기초 21
__3.1.1 URL 22
__3.1.2 DNS 23
__3.1.3 TCP/IP 24
__3.1.4 HTTP 메시지 26
__3.1.5 HTTP 메서드 28
__3.1.6 상태 코드 29
__3.1.7 HTTP 헤더 30
__3.1.8 쿠키를 사용한 상태 관리 32
3.2 HTTP 실습하기 33
__3.2.1 GET과 POST로 데이터 전송하기 33
__3.2.2 상태 코드 확인 및 변경하기 38
__3.2.3 임의로 HTTP 헤더 추가하기 42
3.3 안전한 통신을 위한 HTTPS 45
__3.3.1 HTTP의 약점 45
__3.3.2 HTTP 약점을 해결하는 TLS 47
__3.3.3 HTTPS 도입 권장 49
__3.3.4 안전한 콘텍스트만 이용 가능한 API 50
__3.3.5 Mixed Content의 위험성 51
__3.3.6 HSTS를 사용해 HTTPS 통신 강제하기 53
마무리 56
CHAPTER 4 Origin에 의한 애플리케이션 간 접근 제한 57
4.1 애플리케이션 간 접근 제한의 필요성 57
4.2 동일 출처 정책에 의한 보호 59
__4.2.1 출처 60
__4.2.2 동일 출처 정책 60
__4.2.3 동일 출처에 의해 접근 제한되지 않는 사례 65
4.3 동일 출처 정책에 따른 제한 실습 66
__4.3.1 교차 출처에 요청 전송 제한 확인하기 66
__4.3.2 iframe 내부 교차 출처 페이지에 접근 제한 확인하기 67
4.4 CORS 71
__4.4.1 CORS 방식 72
__4.4.2 단순 요청 73
__4.4.3 Preflight Request 74
__4.4.4 쿠키를 포함하는 요청 전송 80
__4.4.5 CORS 요청 모드 81
__4.4.6 crossorigin 속성을 사용하는 CORS 요청 82
4.5 CORS 실습 84
__4.5.1 교차 출처의 요청을 허가하는 방법 84
__4.5.2 접근 허가 출처를 제한하는 방법 87
4.6 postMessage를 사용해 iframe으로 데이터 전송하기 89
4.7 프로세스 분리에 따른 사이드 채널 공격 대책 91
__4.7.1 사이드 채널 공격을 방어하는 Site Isolation 91
__4.7.2 출처마다 프로세스를 분리하는 구조 93
__4.7.3 Cross-Origin Isolation이 유효한 페이지에서 SharedArrayBuffer 사용하기 95
마무리 96
CHAPTER 5 XSS 97
5.1 능동적 공격과 수동적 공격 97
__5.1.1 능동적 공격 97
__5.1.2 수동적 공격 98
5.2 XSS 99
__5.2.1 XSS 구조 100
__5.2.2 XSS 위협 101
__5.2.3 세 가지 XSS 102
__5.2.4 DOM 기반 XSS 104
__5.2.5 XSS 대책 109
5.3 XSS 방지 실습 121
__5.3.1 적절한 DOM API를 사용하는 방법 121
__5.3.2 URL 스키마를 http/https로 한정하기 125
__5.3.3 XSS 문제를 줄이는 DOMPurify 라이브러리 사용하기 127
5.4 Content Security Policy를 사용한 XSS 대처하기 129
__5.4.1 CSP 개요 129
__5.4.2 Strict CSP 134
__5.4.3 문자열을 안전한 타입으로 사용하는 Trusted Types 138
__5.4.4 Report-Only 모드를 사용한 policy 테스트 143
5.5 CSP 설정 실습하기 146
__5.5.1 nonce-source를 사용한 CSP 설정하기 146
__5.5.2 strict-dynamic을 사용해 동적으로 〈script〉 요소 생성하기 150
__5.5.3 Trusted Types 설정 방법 153
마무리 155
CHAPTER 6 기타 수동적인 공격: CSRF, 클릭재킹, 오픈 리다이렉트 157
6.1 CSRF 157
__6.1.1 CSRF의 구조 157
__6.1.2 토큰을 사용하는 CSRF 대책 159
__6.1.3 Double Submit 쿠키를 사용하는 CSRF 대책 161
__6.1.4 SameSite 쿠키를 사용하는 CSRF 대책 163
__6.1.5 Origin 헤더를 사용하는 CSRF 대책 164
__6.1.6 CORS를 사용하는 CSRF 대책 165
6.2 CSRF 대책 실습 166
__6.2.1 간단한 확인용 로그인 화면 생성 166
__6.2.2 폼 전송 화면 생성하기 170
__6.2.3 피싱 사이트에서 CSRF 공격하기 173
__6.2.4 Double Submit 쿠키를 사용하는 CSRF 대책 174
6.3 클릭재킹 178
__6.3.1 클릭재킹의 구조 178
__6.3.2 클릭재킹 대책 181
6.4 클릭재킹 대책 실습 182
__6.4.1 클릭재킹 공격 재현하기 183
__6.4.2 X-Frame-Options에 의한 클릭재킹 대책 186
6.5 오픈 리다이렉트 187
__6.5.1 오픈 리다이렉트의 구조 187
__6.5.2 URL 검사를 통한 오픈 리다이렉트 대책 189
6.6 오픈 리다이렉트 대책 실습 190
__6.6.1 오픈 리다이렉트 공격 재현하기 190
__6.6.2 URL 검사에 의한 대책 191
마무리 192
CHAPTER 7 인증 · 인가 193
7.1 인증과 인가의 차이 193
__7.1.1 인증 193
__7.1.2 인증의 3요소 193
__7.1.3 인가 194
7.2 인증 기능의 보안 리스크 195
__7.2.1 인증 방식의 종류 195
__7.2.2 비밀번호 인증에 대한 공격 196
__7.2.3 비밀번호 인증 공격에 대한 대책 197
7.3 계정 생성 폼 구현 실습 198
__7.3.1 계정 생성 페이지 준비 198
__7.3.2 입력 내용에 따른 type 속성 변경 201
__7.3.3 입력 내용 유효성 검사 204
COLUMN 비밀번호 패턴 조합의 경우의 수 210
__7.3.4 비밀번호 입력 보조하기 211
7.4 로그인 정보 유출에 주의하기 217
마무리 219
CHAPTER 8 라이브러리를 노린 보안 리스크 221
8.1 라이브러리의 사용 221
__8.1.1 오픈소스 소프트웨어의 사용 221
__8.1.2 프런트엔드 라이브러리 상황 222
8.2 라이브러리에 숨어 있는 보안 리스크 223
__8.2.1 서드파티 라이브러리를 경유하는 공격 223
__8.2.2 리뷰가 충분하지 않은 코드에 의한 취약성 223
__8.2.3 계정 탈취에 의한 취약성 224
__8.2.4 의존 관계 상속에 의한 취약성 224
__8.2.5 CDN에서 콘텐츠 변조 225
__8.2.6 CDN에서 취약성을 갖는 버전의 라이브러리 가져오기 226
8.3 라이브러리 사용의 보안 대책 226
__8.3.1 취약성을 확인하는 툴과 서비스 사용 226
__8.3.2 유지보수가 꾸준히 이루어지는 라이브러리 사용하기 230
__8.3.3 최신 버전의 라이브러리 사용하기 230
__8.3.4 하위 자원 무결성을 통한 변조 확인하기 231
__8.3.5 CDN에서 불러오는 라이브러리의 버전 지정하기 232
마무리 233
APPENDIX A 앞에서 다루지 않은 주제 235
A.1 보안 관련 보충학습 235
__A.1.1 책에서 다루지 않은 주제 학습 236
__A.1.2 보안 관련 정보를 얻는 필자의 방법 237
A.2 HTTPS 실습 240
__A.2.1 HTTPS 서버 구현하기 240
__A.2.2 HSTS를 사용해 HTTPS로 통신 강제하기 246
APPENDIX B 한국어판 부록 251
B.1 보안 체크리스트 251
참고문헌 255
찾아보기 260