Spring Security 3/e [스프링 시큐리티를 이용한 애플리케이션 보안]
- 원서명Spring Security - Third Edition: Secure your web applications, RESTful services, and microservice architectures (ISBN 9781787129511)
- 지은이믹 넛슨(Mick Knutson), 로버트 윈치(Robert Winch), 피터 뮬라리엔(Peter Mularien)
- 옮긴이김지연
- ISBN : 9791161752488
- 40,000원
- 2019년 01월 29일 펴냄
- 페이퍼백 | 624쪽 | 188*235mm
- 시리즈 : 해킹과 보안
책 소개
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
요약
보안의 기본 개념 설명과 함께 보안에 취약한 애플리케이션을 스프링 시큐리티 프레임워크를 이용해 견고하고 안전하게 구현하는 과정을 단계적으로 다룬다. 애플리케이션에 인증 및 접근 제어 메커니즘 연동, 동시성 제어, 세션 관리 등 스프링 시큐리티 4.2의 기초부터 활용까지 상세한 가이드를 제시한다.
이 책에서 다루는 내용
■ 일반적인 보안 취약점 및 해결 방법
■ 모의해킹을 통한 보안 취약점 발견 방법
■ 인증 및 권한 부여 구현
■ LDAP, Active Directory, CAS, OpenID 및 OAuth와 같은 기존의 기업 인프라 구성 요소 사용 방법
■ Spring, Spring-boot 및 Spring-data와 같은 보편적인 프레임워크 연동
■ RESTful 웹 서비스 및 마이크로서비스 아키텍처의 보안 문제
■ LDAP, Apache Directory server 및 SAML과 같은 다른 보안 인프라 구성 요소와 스프링 연동
이 책의 대상 독자
자바 웹 및 RESTful 웹 서비스의 개발자이고, 자바 8, 자바 웹 및 RESTful 웹 서비스 애플리케이션, XML 및 스프링 프레임워크의 생성에 대한 지식이 있는 사람이면 누구에게나 도움이 될 것이며, 스프링 시큐리티에 대한 어떠한 경험도 필요하지 않다.
이 책의 구성
1장, ‘취약한 애플리케이션의 구조’에서는 달력 애플리케이션에 대한 가상 보안 감사를 다루며, 스프링 시큐리티를 적용해 해결할 수 있는 일반적인 보안 문제에 대해 설명한다. 또한 몇 가지 기본 보안 용어에 대해 설명하고, 샘플 애플리케이션을 실행하기 위한 전제 조건에 대해 알아본다.
2장, ‘스프링 시큐리티 시작하기’에서는 “Hello World”를 이용해 스프링 시큐리티를 설치하는 방법에 대해 설명한다. 또한 스프링 시큐리티에서 사용하는 가장 일반적인 사용자 정의 설정에 대해서도 알아본다.
3장, ‘사용자 정의 인증’에서는 실무에서의 문제를 해결하기 위한 인증 인프라의 핵심 부분을 사용자 정의를 통해 구현함으로써 스프링 시큐리티의 인증 구조를 설명한다. 이를 통해, 스프링 시큐리티의 인증 방식을 이해하고 기존 인증 메커니즘과 새로운 인증 메커니즘을 연동하는 방법을 배운다.
4장, ‘JDBC 기반 인증’에서는 스프링 시큐리티에 빌트인된 JDBC를 활용해 데이터베이스 기반의 인증을 다룬다. 또한 스프링 시큐리티의 새로운 패스워드화 모듈을 사용해 패스워드를 보호하는 방법에 대해 설명한다.
5장, ‘스프링 데이터를 이용한 인증’에서는 스프링 시큐리티의 스프링 데이터 JPA 및 스프링데이터, MongoDB를 연동해 데이터베이스에 대한 인증을 다룬다.
6장, ‘LDAP 디렉터리 서비스’에서는 LDAP 디렉터리 서버와 애플리케이션을 연동하는 방법에 대해 설명한다.
7장, ‘Remember-Me 서비스’에서는 스프링 시큐리티에서 사용하는 Remember-Me 기능과 이를 구성하는 방법을 설명하며, 사용 시 염두에 둬야 할 추가 고려 사항에 대해서도 알아본다.
8장, ‘TLS를 사용한 클라이언트 인증서 인증’에서는 인증서 관리가 추가 보안을 제공할 수 있는 샘플 애플리케이션과 같은 특정 비즈니스 시나리오에 대한 대안으로서 X.509 인증서 기반 인증을 설명한다.
9장, ‘OAuth 2 적용하기’에서는 OAuth 2 기반의 사용자 로그인 및 사용자 속성에 대해 다루며, 스프링 OAuth 2와 스프링 소셜(Spring Social) 연동 방법을 포함해 OAuth 2 프로토콜의 논리적 흐름에 대한 전반적인 내용을 설명한다.
10장, ‘CAS를 활용한 SSO’에서는 샘플 애플리케이션에 CAS(Central Authentication Service)를 이용해 싱글 사인 온(Single-Sign-On), SSO 및 싱글 로그아웃(Single Logout) 기능을 구현하는 방법에 대해 알아본다. 또한 상태를 저장하지 않는 서비스(stateless services)에서 CAS 프록시 티켓을 사용하는 방법에 대해서도 배운다.
11장, ‘미세 접근 제어’에서는 스프링 시큐리티의 메서드 보안 기능을 사용한 페이지 내 권한 검사(일부 페이지 렌더링) 및 비즈니스 계층 보안에 대해 다룬다.
12장, ‘접근 제어 목록’에서는 까다로운 비즈니스 관련 보안 문제에 유연하게 적용할 수 있는 스프링 시큐리티의 ACL 모듈을 사용해 비즈니스 객체 수준 보안의 개념과 기본 구현 방법을 다룬다.
13장, ‘사용자 정의 권한 부여’에서는 스프링 시큐리티 권한 부여 인프라의 주요 부분에 대한 사용자 정의 구현체를 작성해 스프링 시큐리티의 권한 부여가 이뤄지는 방식을 설명한다.
14장, ‘세션 관리’에서는 스프링 시큐리티가 사용자 세션을 관리하고 보호하는 방법에 대해 설명한다. 일단, 세션 변조 공격(Session Fixation Attack)에 대해 설명하며, 스프링 시큐리티를 이용해 방어하는 방법에 대해 배운다. 또한 로그인한 사용자를 관리하는 방법과 단일 사용자가 보유한 동일 세션 수를 제한하는 방법에 대해 설명한다. 마지막으로, 스프링 시큐리티에서 http 세션과 사용자를 연결하는 방법과 사용자를 지정하는 방법에 대해 다룬다.
15장, ‘스프링 시큐리티의 추가 기능’에서는 스프링 시큐리티의 추가 기능과 크로스 사이트 스크립팅(XSS), 크로스 사이트 요청 위조(CSRF), 동기화 토큰 및 클릭 재킹(Clickjacking)과 같은 일반적인 보안 취약점과 이를 방지하는 방법에 대해 설명한다.
16장, ‘스프링 시큐리티 4.2 마이그레이션’에서는 설정 변경 사항, 클래스 및 패키지 마이그레이션(migration), 새로운 주요 기능 등을 포함한 스프링 시큐리티 3에서의 마이그레이션 방향을 제공한다. 또한 스프링 시큐리티 4.2에서 볼 수 있는 새로운 기능을 강조하고 책에서 설명하는 기능에 대해 도움 자료를 제공한다.
17장, ‘OAuth 2 및 JSON 웹 토큰을 이용한 마이크로서비스 보안’에서는 마이크로서비스 기반 구조를 배우고, OAuth 2와 JWT가 스프링 기반의 애플리케이션에서 역할을 수행하는 방법을 다룬다.
부록의 ‘참고 자료’에서는 스프링 시큐리티와 직접적인 관련은 없지만, 이 책에서 다루는 주제와 관련이 있는 참고 자료를 포함하고 있다. 부록에서 가장 중요한 부분은 이 책의 샘플 코드를 실행하는 데 도움이 되는 내용을 다루는 부분이다.
목차
목차
- 1장. 취약한 애플리케이션의 구조
- 보안 감사
- 샘플 애플리케이션 소개
- JBCP 달력 애플리케이션의 구조
- 애플리케이션 테크놀로지
- 보안 감사 결과 리뷰
- 인증
- 권한 부여
- 데이터베이스 내 인증 정보 보안
- 요약
- 보안 감사
- 2장. 스프링 시큐리티 시작하기
- 스프링 시큐리티 기본 설정
- 샘플 애플리케이션 가져오기
- 의존성 업데이트
- 스프링 시큐리티 XML 설정 파일 구현
- web.xml 파일 업데이트
- 안전한 애플리케이션 실행
- 자주 발생하는 문제점
- 약간의 기능 추가
- 사용자 정의 로그인 페이지
- 요약
- 스프링 시큐리티 기본 설정
- 3장. 사용자 정의 인증
- JBCP 달력의 구조
- CalendarUser 객체
- Event 객체
- CalendarService 인터페이스
- UserContext 인터페이스
- SpringSecurityUserContext 인터페이스
- SecurityContextHolder를 사용한 새로운 사용자 로그인
- 스프링 시큐리티에서의 사용자 관리
- 새로운 사용자로 로그인
- SignupController 업데이트
- 사용자 정의 UserDetailsService 객체 생성
- CalendarUserDetailsService 클래스
- UserDetailsService 설정
- UserDetailsManager에 대한 참조 제거
- CalendarUserDetails 객체
- SpringSecurityUserContext 단순화
- 사용자 정의 AuthenticationProvider 객체 생성
- CalendarUserAuthenticationProvider
- CalendarUserAuthenticationProvider 객체
- 다른 매개변수를 이용한 인증
- 인증 메서드 선택
- 요약
- JBCP 달력의 구조
- 4장. JDBC 기반 인증
- 필수 의존성
- H2 데이터베이스 사용
- 제공된 JDBC 스크립트
- H2 임베디드 데이터베이스 설정
- JDBC UserDetailsManager 구현체 설정
- 스프링 시큐리티의 기본 사용자 스키마
- 사용자 정의
- 사용자 권한 정의
- UserDetailsManager 인터페이스
- 그룹 기반 접근 제어 그룹 기반 접근 제어 설정
- 사용자 정의 스키마 지원
- 올바른 JDBC SQL 쿼리 판단
- 로드된 SQL 스크립트 업데이트
- CalendarUser 권한 SQL
- 사용자 정의 권한 삽입
- 사용자 정의 SQL 쿼리 사용을 위한 JdbcUserDetailsManager 설정
- 보안 패스워드 설정
- PasswordEncoder 메서드
- 패스워드 인코딩 설정
- PasswordEncoder 메서드 설정
- 스프링 시큐리티에 PasswordEncoder 메서드 적용
- 스프링 시큐리티에 솔트 적용
- 스프링 시큐리티 설정 업데이트
- 기존 패스워드 마이그레이션
- DefaultCalendarUserService 업데이트
- 솔트를 적용한 패스워드 사용
- 요약
- 5장. 스프링 데이터를 이용한 인증
- 스프링 데이터 JPA
- 의존성 업데이트
- 스프링 데이터 JPA 사용을 위한 JBCP 달력 업데이트
- 데이터베이스 설정 재구성
- 데이터베이스 초기화
- SQL에서 ORM으로 리팩토링
- JPA를 사용한 도메인 객체 매핑
- 스프링 데이터 저장소
- 데이터 액세스 객체
- 애플리케이션 서비스
- UserDetailsService 객체
- RDBMS를 문서 데이터베이스로 리팩토링
- MongoDB를 사용한 문서 데이터베이스 구축
- 의존성 업데이트
- MongoDB의 데이터베이스 설정 재구성
- MongoDB 데이터베이스 초기화
- MongoDB와 도메인 객체 매핑
- MongoDB의 데이터 액세스 객체
- 요약
- 스프링 데이터 JPA
- 6장. LDAP 디렉터리 서비스
- LDAP 이해
- LDAP
- 임베디드 LDAP 문제 해결
- 스프링 LDAP 인증 방식 이해
- 사용자 자격 증명 인증
- 아파치 DS를 통한 인증 과정
- 아파치 DS를 통한 역할 결정
- UserDetails의 추가 애트리뷰트 매핑
- 고급 LDAP 설정
- LDAP 패스워드 인코딩과 저장
- 패스워드 비교 인증의 단점
- UserDetailsContextMapper 객체 설정
- UserDetailsContextMapper의 암시적 설정
- 사용자 추가 상세 정보 보기
- LDAP 이해
- LdapUserDetailsService 설정
- LdapUserDetailsService를 사용하기 위한 AccountController 업데이트
- 외부 LDAP 서버와 스프링 시큐리티 연동
- 명시적 LDAP 빈 설정
- 외부 LDAP 서버 참조 설정
- LdapAuthenticationProvider 인터페이스 설정
- UserDetailsService에 대한 역할 검색 위임
- LDAP를 통한 마이크로소프트 AD 연동
- 스프링 시큐리티 4.2의 AD 지원
- 요약
- LdapUserDetailsService를 사용하기 위한 AccountController 업데이트
- 7장. Remember-Me 서비스
- Remember-Me
- 의존성
- 토큰 기반 Remember-Me 기능
- MD5
- Remember-Me 시그니처
- Remember-Me의 안전성
- Remember-Me를 위한 권한 부여 규칙
- 영구 토큰 기반 Remember-Me 설정
- 영구 토큰 기반 Remember-Me 기능의 동작 원리
- JPA 기반 PersistentTokenRepository
- 사용자 정의 Remember-Me 서비스
- 만료된 Remember-Me 세션 정리
- Remember-Me 아키텍처
- Remember-Me와 사용자 라이프 사이클
- IP 주소를 통한 Remember-Me 기능 제한
- 사용자 정의 쿠키 및 HTTP 매개변수명
- 요약
- Remember-Me
- 8장. TLS를 사용한 클라이언트 인증서 인증
- 클라이언트 인증서 인증의 동작 원리
- 클라이언트 인증서 인증 인프라 설정
- 웹 브라우저로 인증서 키 쌍 불러오기
- 클라이언트 인증서 인증 문제 해결
- 스프링 시큐리티에서 클라이언트 인증서 인증 설정
- security 네임스페이스를 사용한 클라이언트 인증서 인증 설정
- 스프링 빈을 사용한 클라이언트 인증서 설정
- 빈 기반 설정의 추가 기능
- 클라이언트 인증서 인증 구현 시 고려 사항
- 요약
- 클라이언트 인증서 인증의 동작 원리
- 9장. OAuth 2 적용하기
- OAuth 2의 가능성
- OAuth 2 애플리케이션 가입
- 스프링 시큐리티에서 OAuth 인증 활성화
- 추가 필수 의존성
- 스프링 시큐리티에서의 OAuth 2 구성
- 로컬 UserConnectionRepository
- 프로바이더 정보에 대한 로컬 데이터베이스 엔트리 생성
- 사용자 정의 UserConnectionRepository 인터페이스
- ConnectionSignup의 흐름
- OAuth 2 프로바이더 연결
- OAuth 2 사용자 추가
- OAuth 2 컨트롤러 로그인 절차
- 추가 OAuth 2 프로바이더
- OAuth 2 사용자 등록 문제
- 비표준 OAuth 2 프로바이더 등록
- OAuth 2의 안전성
- 요약
- OAuth 2의 가능성
- 10장. CAS를 활용한 SSO
- CAS 소개
- 고수준 CAS 인증 흐름
- 스프링 시큐리티와 CAS
- 의존성
- CAS 설치와 설정
- CAS 기본 연동 설정
- CAS ServiceProperties 객체 생성
- CasAuthenticationEntryPoint 객체 추가
- CAS 티켓 검증 사용CasAuthenticationProvider 객체를 이용한 진위성 증명
- 단일 로그아웃
- 단일 로그아웃 설정
- 클러스터 환경
- Stateless 서비스에 대한 프록시 티켓 인증
- 프록시 티켓 인증 설정
- 프록시 티켓 사용
- 프록시 티켓 인증
- CAS 서버 사용자 정의
- CAS WAR 오버레이
- CAS 내부 인증 작동 방식
- 임베디드 LDAP 서버와 CAS 연결 설정
- CAS 단언으로부터 UserDetails 객체 생성
- CAS 응답에 LDAP 애트리뷰트 반환
- LDAP 애트리뷰트와 CAS 애트리뷰트 매핑
- 사용자 정의 애트리뷰트에 접근하기 위한 CAS 서비스 권한 부여
- CAS로부터 UserDetails 획득
- GrantedAuthorityFromAssertionAttributesUser 객체
- SAML 1.1을 사용한 또 다른 티켓 인증
- 애트리뷰트 조회의 유용성
- 추가 CAS 기능
- 요약
- 11장. 미세 접근 제어
- 그레이들 의존성
- 스프링 표현 언어 통합
- Thymeleaf 스프링 시큐리티 태그 라이브러리를 활용한 조건부 렌더링
- URL 접근 규칙을 기반으로 한 조건부 렌더링
- SpEL을 활용한 조건부 렌더링
- 컨트롤러 로직을 사용한 조건부 컨텐츠 렌더링
- WebInvocationPrivilegeEvaluator 클래스
- 페이지 내 권한 부여를 설정하는 최적의 방법
- 메서드 레벨 보안
- 다중 보안의 필요성
- 인터페이스 기반 프록시
- JSR-250 호환 표준 규칙
- 스프링의 @Secured 어노테이션을 사용한 메서드 보안
- 메서드 매개변수를 포함하는 메서드 보안 규칙
- 반환된 값을 통합하는 메서드 보안 규칙
- 역할 기반 필터링을 통한 메서드 데이터 보호
- @PreFilter를 사용한 컬렉션 사전 필터링
- 메서드 권한 부여 타입 비교
- 어노테이션 기반 보안을 위한 고려 사항
- 요약
- 그레이들 의존성
- 12장. 접근 제어 목록
- ACL 개념 모듈
- 스프링 시큐리티에서의 ACL
- 스프링 시큐리티 ACL 지원을 위한 기본 설정
- 그레이들 의존성
- 예제 시나리오 설정
- H2 데이터베이스에 ACL 테이블 추가
- SecurityExpressionHandler 설정
- AclPermissionCacheOptimizer 객체
- 간단한 ACL 엔트리 생성
- 고급 ACL 주제
- 사용자 정의 ACL 퍼미션 선언
- ACL 퍼미션 평가 활성화
- 수정 가능 ACL과 권한 부여
- 일반적인 ACL 적용 시 고려 사항
- 스프링 시큐리티 ACL의 필요성
- 요약
- 13장. 사용자 정의 권한 부여
- 요청에 대한 권한 부여
- 접근 결정의 취합 방식 설정
- UnanimousBased 접근 결정 관리자 설정
- 요청에 대한 표현식 기반 권한 부여
- URL에 대한 접근 제어의 동적 정의
- RequestConfigMappingService 설정
- 사용자 정의 SecurityMetadataSource 구현
- 사용자 정의 SecurityMetadataSource 등록
- antMatchers() 메서드 제거
- 사용자 정의 표현식 생성
- 사용자 정의 SecurityExpressionRoot 설정
- 사용자 정의 SecurityExpressionHandler 설정
- CustomWebSecurityExpressionHandler 설정과 사용
- CustomWebSecurityExpressionHandler에 대한 대안
- 요약
- 요청에 대한 권한 부여
- 14장. 세션 관리
- 세션 고정 보호 설정.
- 세션 고정 공격에 대한 이해
- 스프링 시큐리티를 사용한 세션 고정 공격 방어
- 세션 고정 공격 시뮬레이션
- 세션 고정 보호 옵션 비교
- 사용자 당 동시 세션 수 제한
- 동시 세션 제어 설정
- 동시 세션 제어 테스트
- 만료 세션 리다이렉트 설정.
- 동시성 제어의 일반적인 문제점
- 강제 로그아웃 대신 인증 방지 설정
- 동시 세션 제어의 장점
- 사용자의 활성화된 세션 표시
- 스프링 시큐리티가 HttpSession 메서드를 사용하는 방법
- HttpSessionSecurityContextRepository 인터페이스
- 스프링 시큐리티에 HttpSession를 사용하도록 설정
- 스프링 시큐리티의 DebugFilter를 이용한 디버깅
- 요약
- 세션 고정 보호 설정.
- 15장. 스프링 시큐리티의 추가 기능
- 보안 취약점
- 크로스 사이트 스크립팅
- 사이트 간 요청 변조
- 동기화 토큰
- CSRF 보호 사용 시점
- 기본 CSRF 지원
- CSRF 보호 구현 시 주의사항
- 보안 HTTP 응답 헤더
- 기본 보안 헤더
- 사용자 정의 헤더
- 요약
- 16장. 스프링 시큐리티 4.2 마이그레이션
- 소개
- 샘플 마이그레이션
- 스프링 시큐리티 4.2의 향상된 기능
- 스프링 시큐리티 4.x의 기타 변경 사항
- 스프링 시큐리티 4의 설정 변경
- 삭제된 기능
- spring-security-core 삭제
- spring-security-web 삭제
- 기본 필터 URL 마이그레이션
- JAAS
- 요약
- 17장. OAuth 2 및 JSON 웹 토큰을 이용한 마이크로서비스 보안
- 마이크로서비스의 개념
- 단일체.
- 마이크로서비스
- 서비스 기반 아키텍처
- 마이크로서비스 보안
- 서비스 통신
- 결합성
- 기술적 복잡성
- OAuth 2 사양
- 액세스 토큰
- 권한 부여 방식
- JSON 웹 토큰(JWT)
- 토큰 구조
- 스프링 시큐리티에서의 OAuth 2 지원
- 자원 소유자
- 자원 서버
- 권한 부여 서버
- RSA JWT 액세스 토큰 변환기 keypair
- OAuth 2 resource 속성 설정
- OAuth 2 Client 속성 설정
- JWT 액세스 토큰 변환기
- UserDetailsService 객체
- OAuth 2 서버 애플리케이션 실행
- 마이크로서비스 클라이언트
- OAuth 2 클라이언트 설정
- 요약
- JBCP 달력 샘플 코드 시작
- 마이크로서비스의 개념
- 부록. 참고 자료
- 그레이들 빌드툴
- 그레이들 IDE 플러그인
- 새로운 작업 공간 생성
- 샘플 코드의 구조
- 샘플 코드 가져오기
- 샘플 코드 실행
- 톰캣 HTTPS 설정