책 소개
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
https://github.com/AcornPublishing/api-security-action
요약
API는 IT 서비스의 핵심이다. 이제는 서비스를 하나의 시스템에 통합해 구현하기보다는 마이크로서비스와 각 서비스를 연결하기 위한 API를 제공하는 형태로 변화하고 있다. 이런 환경에서 API 보안은 무엇보다 중요하다. 이 책을 읽고 나면 기본적인 API 보안이란 무엇인지에 대한 기본적인 것부터 API 인증과 권한, 쿠버네티스, 사물인터넷 환경에서의 실제 적용 방법까지 다양한 사례를 경험할 수 있을 것이다.
추천의 글
“보안 서비스 설계 및 구현에 대한 포괄적인 가이드이다. 보안을 관리하는 모든 API 실무자가 반드시 읽어야 할 책이다.”
“API 보안에 대한 심층적인 이해를 원하는 사람은 이 책을 읽어야 한다.”
"API를 개발하는 사람들에게 이 책을 강력히 추천한다."
"내가 읽은 API 보안에 대한 가장 포괄적인 가이드이다."
이 책의 대상 독자
다양한 환경에서 API를 보호하는 데 필요한 기술을 안내하기 위해 쓴 책이다. 기본 보안 코딩 기술을 다루는 것을 시작으로 인증 및 권한에 대한 기술을 심도 있게 살펴본다. 그 과정에서 속도 제한 및 암호화와 같은 기술을 사용해 공격으로부터 API를 강화할 수 있는 방법을 알게 될 것이다.
웹 API 구축 경험이 있고 API 보안 기술 및 모범 사례에 대한 지식을 향상시키려는 개발자를 위해 이 책을 썼다. 독자는 RESTful이나 다른 원격 API를 구축하는 데 익숙해야 하며, 편집기나 통합 개발 환경(IDE, Integrated Development Environment)과 같은 프로그래밍 언어와 도구를 사용할 수 있어야 한다. 하지만 보안 코딩이나 암호화에 대한 사전 경험은 없다고 가정할 것이다. 이 책은 최신 API 보안의 적용 방식을 빠르게 알고 싶어하는 기술 설계자(technical architect)에게도 유용하게 사용될 것이다.
이 책의 구성
이 책은 총 5부, 13장으로 구성돼 있다.
1부에서는 API 보안의 기본 사항을 설명하고, 책의 나머지 부분을 위한 보안의 기초적인 내용으로 구성한다.
1장에서는 API 보안에 대한 주제와 API 보안의 구성 요소를 정의하는 방법에 대해 소개하고, API 보안과 관련된 기본 메커니즘과 API의 위협 및 취약성을 어떻게 고려할 것인지에 대해 알아본다.
2장에서는 보안 개발과 관련된 기본 원칙과 이러한 원칙이 API 보안에 적용되는 방법에 대해 설명하고, 표준 코딩 방식을 사용해 일반적인 소프트웨어 보안 결함을 방지하는 방법에 대해 알아본다. 또한 API를 위해 책 전체에 걸쳐 코드 샘플의 기초가 되는 Natter라는 예제 애플리케이션을 소개한다.
3장에서는 이 책의 나머지 부분의 모든 기본 보안 메커니즘 개발에 대해 살펴보며, 기본 인증(authentication), 속도 제한(rate-limiting), 감사 로깅(audit logging), 접근 통제(access control) 메커니즘을 Natter API에 추가하는 방법에 대해 알아본다.
2부에서는 RESTful API에 대한 인증 메커니즘을 자세히 살펴본다. 인증은 다른 모든 보안 통제의 기반이기 되기 때문에 확실하게 구축되도록 시간을 투자해야 한다.
4장에서는 전통적인 세션 쿠키(session cookie) 인증에 대해 다루고 최신 웹 API를 사용하기 위해 이를 업데이트해서 기존 웹 애플리케이션의 기술을 적용하는 방법을 보여준다. 또한 최신 웹 API 사용을 위해 SameSite 쿠키 설정과 같은 새로운 개발에 대해서도 다루게 될 것이다.
5장에서는 전달자 토큰(bearer token)과 표준 권한 헤더를 포함한 토큰 기반 인증에 대한 대체 접근 방식을 살펴본다. 또한 로컬 저장소를 사용해 웹 브라우저에 토큰을 저장하고 백엔드(backend)에서 데이터베이스 토큰 저장소를 강화하는 내용도 다룬다.
6장에서는 JSON 웹 토큰(JSON Web Token)과 같은 자체 포함 토큰 형식과 대체 토큰 형식에 대해 설명한다.
3부에서는 권한에 대한 접근 방식과 누가 무엇을 할 수 있는지 결정하는 것에 대해 살펴본다.
7장에서는 토큰 기반 인증(token-based authentication)에 대한 표준 접근 방식이자 권한 위임에 대한 접근 방식인 OAuth2에 대해 설명한다.
8장에서는 사용자의 신원을 통해서 수행할 수 있는 행위를 결정하는 신원 기반(identity-based) 접근 통제 기술을 자세히 살펴보며, 접근 통제 목록(access control list), 역할 기반(role-based) 접근 통제 및 속성 기반(attribute-based) 접근 통제에 대해 다룬다.
9장에서는 세분화된 키를 기반으로 하는 신원 기반 방식을 대체하는 기능 기반(capability-based) 접근 통제에 대해 살펴보며, 접근 통제에 대한 흥미롭고 새로운 접근이 가능한 토큰 형식인 마카롱(macaroon)에 대해 다룬다.
4부에서는 쿠버네티스 환경에서 실행되는 마이크로서비스 API 보안에 대해 자세히 설명한다.
10장에서는 쿠버네티스에 API를 배포하는 방법과 개발자 관점에서 보안을 위한 모범 사례를 자세히 소개한다.
11장에서는 서비스 간(service-to-service) API 호출 시 인증에 대한 접근 방식과 서비스 계정 자격 증명 및 기타 비밀 정보를 안전하게 저장하는 방법에 대해 설명한다.
5부에서는 사물 인터넷(IoT, Internet of Things)에서의 API에 대해 살펴본다.
12장에서는 사물 인터넷 환경에서 클라이언트와 서비스 간의 통신을 보호하는 방법에 대해 설명한다. API 요청이 여러 전송 프로토콜(transport protocol)을 통해 이동해야 할 때 단대단(end-to-end) 보안을 보장하는 방법에 대해 배울 것이다.
13장에서는 사물 인터넷 환경에서 API 요청을 승인하는 방식에 대해 자세히 설명하며, 온라인 서비스에서 장치의 연결이 끊겼을 때 오프라인 인증 및 접근 통제에 대해서도 살펴본다.
목차
목차
- 1부. 기초
- 1장. API 보안의 정의
- 1.1 비유: 운전면허 시험 응시
- 1.2 API 정의
- 1.2.1 API 방식
- 1.3 상황상의 API 보안
- 1.3.1 일반적인 API 배포
- 1.4 API 보안 요소
- 1.4.1 자산
- 1.4.2 보안 목표
- 1.4.3 환경 및 위협 모델
- 1.5 보안 메커니즘
- 1.5.1 암호화
- 1.5.2 식별 및 인증
- 1.5.3 접근 통제 및 권한
- 1.5.4 감사 로깅
- 1.5.5 속도 제한
- 연습 문제 정답
- 요약
- 2장. 보안 API 개발
- 2.1 Natter API
- 2.1.1 Natter API 개요
- 2.1.2 구현 개요
- 2.1.3 프로젝트 준비
- 2.1.4 데이터베이스 초기화
- 2.2 REST API 개발
- 2.2.1 신규 공간 생성
- 2.3 REST 엔드포인트 연결
- 2.3.1 사용
- 2.4 주입 공격
- 2.4.1 주입 공격 방지
- 2.4.2 권한을 통한 SQL 주입 완화
- 2.5 입력 유효성 검증
- 2.6 안전한 출력 생성
- 2.6.1 크로스 사이트 스크립팅 공격 악용
- 2.6.2 크로스 사이트 스크립팅 방지
- 2.6.3 보안 기능 구현
- 연습 문제 정답
- 요약
- 3장. Natter API 보안
- 3.1 보안 통제를 통한 위협 해결
- 3.2 가용성을 위한 속도 제한
- 3.2.1 구아바로 속도 제한
- 3.3 위조 방지를 위한 인증
- 3.3.1 HTTP Basic 인증
- 3.3.2 스크립트로 안전한 비밀번호 저장
- 3.3.3
- 3.3.4 Natter API에 사용자 등록
- 3.3.5 사용자 인증
- 3.4 암호화를 통한 데이터 비공개 유지
- 3.4.1 HTTPS 활성화
- 3.4.2 엄격한 전송 보안
- 3.5 책임 추적성을 위한 감사 로깅
- 3.6 접근 통제
- 3.6.1 인증 적용
- 3.6.2 접근 통제 목록
- 3.6.3 Natter에서 접근 통제 적용
- 3.6.4 Natter 공간에 신규 멤버 추가
- 3.6.5 권한 상승 공격 방지
- 연습 문제 정답
- 요약
- 2부. 토큰 기반 인증
- 4장. 세션 쿠키 인증
- 4.1 웹 브라우저에서 인증
- 4.1.1 자바스크립트에서 Natter API 호출
- 4.1.2 양식 제출 가로채기
- 4.1.3 동일한 출처에서 HTML 제공
- 4.1.4 HTTP 인증의 문제점
- 4.2 토큰 기반 인증
- 4.2.1 토큰 저장소 추상화
- 4.2.2 토큰 기반 로그인 구현
- 4.3 세션 쿠키
- 4.3.1 세션 고정 공격 방지
- 4.3.2 쿠키 보안 속성
- 4.3.3 세션 쿠키 유효성 검증
- 4.4 사이트 간 요청 위조 공격 방지
- 4.4.1 SameSite 쿠키
- 4.4.2 해시 기반 이중 제출 쿠키
- 4.4.3 Natter API용 이중 제출 쿠키
- 4.5 Natter 로그인 UI 구축
- 4.5.1 자바스크립트에서 로그인 API 호출
- 4.6 로그아웃 구현
- 연습 문제 정답
- 요약
- 5장. 최신 토큰 기반 인증
- 5.1 CORS를 통한 도메인 간 요청 허용
- 5.1.1 사전 요청
- 5.1.2 CORS 헤더
- 5.1.3 Natter API에 CORS 헤더 추가
- 5.2 쿠키를 사용하지 않는 토큰
- 5.2.1 데이터베이스에 토큰 상태 저장
- 5.2.2 베어러 인증 스키마
- 5.2.3 만료된 토큰 삭제
- 5.2.4 웹 저장소에 토큰 저장
- 5.2.5 CORS 필터 업데이트
- 5.2.6 웹 저장소에 대한 크로스 사이트 스크립팅 공격
- 5.3 데이터베이스 토큰 저장소 강화
- 5.3.1 데이터베이스 토큰 해싱
- 5.3.2 HMAC으로 토큰 인증하기
- 5.3.3
- 연습 문제 정답
- 요약
- 6장. 자체 포함 토큰 및 JSON 웹 토큰
- 6.1 클라이언트에 토큰 상태 저장
- 6.1.1 HMAC를 통한 JSON 토큰 보호
- 6.2 JSON 웹 토큰
- 6.2.1 표준 JWT 클레임
- 6.2.2 JOSE 헤더
- 6.2.3 표준 JWT 생성
- 6.2.4 서명된 JWT 유효성 검증
- 6.3 민감한 속성 암호화
- 6.3.1 인증된 암호화
- 6.3.2 NaCl로 인증된 암호화
- 6.3.3 암호화된 JWT
- 6.3.4 JWT 라이브러리 사용
- 6.4 안전한 API 설계를 위한 유형 사용
- 6.5 토큰 폐기 처리
- 6.5.1 하이브리드 토큰 구현
- 연습 문제 정답
- 요약
- 3부. 권한
- 7장. OAuth2 및 OpenID Connect
- 7.1 범위 토큰
- 7.1.1 Natter에 범위 토큰 추가
- 7.1.2 범위와 허가의 차이
- 7.2 OAuth2 소개
- 7.2.1 클라이언트 유형
- 7.2.2 권한 부여
- 7.2.3 OAuth2 엔드포인트 검출
- 7.3. 권한 코드 부여
- 7.3.1 다른 유형의 클라이언트에 대한 URI 리다이렉트
- 7.3.2 증명 키 코드 교환으로 코드 교환 강화
- 7.3.3 새로 고침 토큰
- 7.4 접근 토큰 유효성 검증
- 7.4.1 토큰 자체 검사
- 7.4.2 HTTPS 클라이언트 구성 보안
- 7.4.3 토큰 폐기
- 7.4.4 JWT 접근 토큰
- 7.4.5 암호화된 JWT 접근 토큰
- 7.4.6 권한 서버의 토큰 복호화 허용
- 7.5 통합 인증
- 7.6 OpenID Connect
- 7.6.1 ID 토큰
- 7.6.2 OIDC 강화
- 7.6.3 API에 ID 토큰 전달
- 연습 문제 정답
- 요약
- 8장. 신원 기반 접근 통제
- 8.1 사용자 및 그룹
- 8.1.1 LDAP 그룹
- 8.2 역할 기반 접근 통제
- 8.2.1 허가에 역할 매핑
- 8.2.2 고정 역할
- 8.2.3 사용자 역할 결정
- 8.2.4 동적 역할
- 8.3 속성 기반 접근 통제
- 8.3.1 결정 결합
- 8.3.2 ABAC 결정 구현
- 8.3.3 정책 에이전트 및 API 게이트웨이
- 8.3.4 분산 정책 시행 및 XACML
- 8.3.5 ABAC의 모범 사례
- 연습 문제 정답
- 요약
- 9장. 기능 기반 보안 및 마카롱
- 9.1 기능 기반 보안
- 9.2 기능 및 REST
- 9.2.1 URI로서의 기능
- 9.2.2 Natter API에서 기능 URI 사용
- 9.2.3 HATEOAS
- 9.2.4 브라우저 기반 클라이언트의 기능 URI
- 9.2.5 기능과 신원 결합
- 9.2.6 기능 URI 강화
- 9.3 마카롱: 주의 사항이 있는 토큰
- 9.3.1 상황별 주의 사항
- 9.3.2 마카롱 토큰 저장소
- 9.3.3 자사 주의 사항
- 9.3.4 타사 주의 사항
- 연습 문제 정답
- 요약
- 4부. 쿠버네티스의 마이크로서비스 API
- 10장. 쿠버네티스의 마이크로서비스 API
- 10.1 쿠버네티스의 마이크로서비스 API
- 10.2 쿠버네티스에 Natter 배포
- 10.2.1 도커 컨테이너로 H2 데이터베이스 빌드
- 10.2.2 쿠버네티스에 데이터베이스 배포
- 10.2.3 Natter API를 도커 컨테이너로 빌드
- 10.2.4 링크 미리보기 마이크로서비스
- 10.2.5 신규 마이크로서비스 배포
- 10.2.6 링크 미리보기 마이크로서비스 호출
- 10.2.7 SSRF 공격 방지
- 10.2.8 DNS 리바인딩 공격
- 10.3 마이크로서비스 통신 보안
- 10.3.1 TLS로 통신 보안
- 10.3.2 TLS에 서비스 메시 사용
- 10.3.3 네트워크 연결 잠금
- 10.4 들어오는 요청 보안
- 연습 문제 정답
- 요약
- 11장. 서비스 간 API 보안
- 11.1 API 키 및 JWT 베어러 인증
- 11.2 OAuth2 클라이언트 자격 증명 부여
- 11.2.1 서비스 계정
- 11.3 OAuth2에 JWT 베어러 부여
- 11.3.1 클라이언트 인증
- 11.3.2 JWT 생성
- 11.3.3 서비스 계정 인증
- 11.4 상호 TLS 인증
- 11.4.1 TLS 인증서 인증 작동 방식
- 11.4.2 클라이언트 인증서 인증
- 11.4.3 클라이언트 신원 유효성 검증
- 11.4.4 서비스 메시 사용
- 11.4.5 OAuth2를 통한 상호 TLS
- 11.4.6 인증서 바인딩 접근 토큰
- 11.5 서비스 자격 증명 관리
- 11.5.1 쿠버네티스 비밀
- 11.5.2 키 및 비밀 관리 서비스
- 11.5.3 디스크에 수명이 긴 비밀 방지
- 11.5.4 키 파생
- 11.6 사용자 요청에 대한 서비스 API 호출
- 11.6.1 팬텀 토큰 양식
- 11.6.2 OAuth2 토큰 교환
- 연습 문제 정답
- 요약
- 5부. IoT용 API
- 12장. IoT 통신 보안
- 12.1 전송 계층 보안
- 12.1.1 데이터그램 TLS
- 12.1.2 제한된 장치를 위한 암호 제품군
- 12.2 사전 공유 키
- 12.2.1 PSK 서버 구현
- 12.2.2 PSK 클라이언트
- 12.2.3 원시 PSK 암호 제품군 지원
- 12.2.4 순방향 비밀성을 가진 PSK
- 12.3 종단 간 보안
- 12.3.1 COSE
- 12.3.2 COSE의 대체 방안
- 12.3.3 오용 방지 인증 암호화
- 12.4 키 배포 및 관리
- 12.4.1 일회성 키 프로비저닝
- 12.4.2 키 배포 서버
- 12.4.3 전방 비밀 유지에 대한 래칫
- 12.4.4 침해 후 보안
- 연습 문제 정답
- 요약
- 13장. IoT API 보안
- 13.1 장치 인증
- 13.1.1 장치 식별
- 13.1.2 장치 인증서
- 13.1.3 전송 계층에서 인증
- 13.2 종단 간 인증
- 13.2.1 OSCORE
- 13.2.2 REST API에서 재생 방지
- 13.3 제한된 환경을 위한 OAuth2
- 13.3.1 장치 권한 부여
- 13.3.2 ACE-OAuth
- 13.4 오프라인 접근 통제
- 13.4.1 오프라인 사용자 인증
- 13.4.2 오프라인 권한
- 연습 문제 정답
- 요약
- 부록 A. 자바 및 메이븐 설정