
구매문의 및 도서상담은 031-944-3966(매장)으로 문의해주세요.
매장전집은 전화 혹은 매장방문만 구입 가능합니다.

지은이 : 강준현
현대적인 소프트웨어 아키텍처와 보안 해결책의 접점을 탐구하는 시니어 소프트웨어 엔지니어이자 애자일 컨설턴트다. 포스코DX(구 포스코ICT)에서 대규모 MES의 서버 개발 및 운영을 담당하며 실시간 무중단 가동 시스템의 안정성을 경험했다. 이후 스타트업 지뉴인의 개발 리드를 거쳐, 애자일 혁신의 중심지인 브로드컴의 탄주 랩스(구 피보탈 랩스)에서 소프트웨어 엔지니어 및 애자일 컨설턴트로 활동했다. 현재는 비카인드랩스코리아에서 시니어 소프트웨어 엔지니어로서 복잡한 비즈니스 요구사항을 애자일 방법론과 견고한 엔지니어링으로 풀어내는 데 집중하고 있다. 스프링 프레임워크 생태계에 대한 관심을 바탕으로, 수많은 실전 프로젝트에서 스프링 시큐리티를 활용한 보안 아키텍처를 설계하고 구축해 왔다. 프레임워크의 내부 동작 원리를 파고들어 컴포넌트를 확장하거나 고난도의 문제를 해결하는 과정을 블로그에 기록하며 지식을 공유하고 있다.
읽기 전 가이드
1부. 스프링 시큐리티 소개
_1장. 서블릿 필터 체인과 아키텍처
__1.1. 서블릿 컨테이너와 서블릿 필터 체인
___1.1.1. 서블릿과 서블릿 컨테이너
___1.1.2. 서블릿 컨테이너 종류
___1.1.3. 서블릿 필터 체인
__1.2. 서블릿 필터 체인 확장
___1.2.1. DelegatingFilterProxy 클래스
__1.3. 시큐리티 필터 체인
___1.3.1. 시큐리티 필터 체인 동작 과정
___1.3.2. 인증/인가 필터들
_2장. Hello Spring Security
__2.1. 인텔리제이 설치
__2.2. 첫 스프링 시큐리티 프로젝트 만들기
___2.2.1. 프로젝트 만들기
___2.2.2. 프로젝트 살펴보기
__2.3. 컨트롤러 만들기
__2.4. 의존성 추가하기
___2.4.1. 에러 응답
___2.4.2. 에러 원인
__2.5. 사용자 인증받기
___2.5.1. 폼 로그인 인증
___2.5.2. HTTP 기본 인증
2부. 인증
_3장. 스프링 시큐리티 인증 아키텍처
__3.1. Authentication 인스턴스
__3.2. 인증 매니저와 제공자
___3.2.1. 인증 매니저
___3.2.2. 인증 제공자
__3.3. Authentication 인스턴스 보관
___3.3.1. 시큐리티 컨텍스트
___3.3.2. 시큐리티 컨텍스트 홀더
___3.3.3. 시큐리티 컨텍스트 보관 전략
___3.3.4. 시큐리티 컨텍스트 보관 전략별 특징
____3.3.4.1. ThreadLocal 클래스
____3.3.4.2. 스레드 로컬 모드
____3.3.4.3. 상속 가능한 스레드 로컬 모드
____3.3.4.4. 전역 모드
__3.4. 인증 프로세스 필터
__3.5. 인증 핸들러
___3.5.1. 인증 성공 핸들러
___3.5.2. 인증 실패 핸들러
___3.5.3. 포워드와 리다이렉트
_4장. 폼 로그인 인증
__4.1. 폼 로그인 디폴트 설정과 필터 체인
___4.1.1. UsernamePasswordAuthenticationFilter 클래스
___4.1.2. DefaultLoginPageGeneratingFilter 클래스
___4.1.3. DefaultLogoutPageGeneratingFilter 클래스
__4.2. 폼 로그인 사용자 인증 프로세스
__4.3. 폼 로그인 인증 컴포넌트
___4.3.1. 사용자 인증 작업
___4.3.2. 사용자 정보 조회
___4.3.3. 비밀번호 암호화
____4.3.3.1. NoOpPasswordEncoder 클래스
____4.3.3.2. BCryptPasswordEncoder 클래스
____4.3.3.3. Argon2PasswordEncoder 클래스
____4.3.3.4. Pbkdf2PasswordEncoder 클래스
____4.3.3.5. SCryptPasswordEncoder 클래스
____4.3.3.6. DelegatingPasswordEncoder 클래스
_5장. 폼 로그인 인증 구현하기
__5.1. 프로젝트 구성
__5.2. 회원 가입 구현
___5.2.1. 회원 가입 페이지
___5.2.2. SignUpController 클래스
___5.2.3. SignUpService 클래스
___5.2.4. UserRepository 인터페이스
___5.2.5. SignUp 레코드 클래스
___5.2.6. UserEntity 클래스
___5.2.7. SecurityConfig 클래스
___5.2.8. 사용자 회원 가입
__5.3. 로그인 구현
___5.3.1. 로그인 페이지
___5.3.2. LoginController 클래스
___5.3.3. UserService 클래스
___5.3.4. User 클래스
___5.3.5. SecurityConfig 클래스
___5.3.6. 사용자 로그인
___5.3.7. 인증 완료 리다이렉트와 SecurityContextHolderFilter 클래스
__5.4. 메인 화면과 로그아웃 구현
___5.4.1. 홈페이지
___5.4.2. HomeController 클래스
___5.4.3. @AuthenticationPrincipal 애너테이션
___5.4.4. SecurityConfig 클래스
___5.4.5. 사용자 로그아웃
__5.5. 인증 실패 처리 구현
___5.5.1. 인증 예외 처리 과정
___5.5.2. 로그인 페이지
___5.5.3. LoginController 클래스
___5.5.4. SecurityConfig 클래스
___5.5.5. 인증 실패 메시지 확인
_6장. HTTP 기본 인증
__6.1. HTTP 기본 인증이란?
__6.2. HTTP 기본 인증 디폴트 설정과 필터 체인
___6.3. HTTP 기본 인증 예외 처리
_7 장. HTTP 기본 인증 구현하기
__7.1. 프로젝트 구성
__7.2. 사용자 정보 준비하기
__7.3. 시큐리티 필터 체인 구성
__7.4. API 엔드포인트 구현
__7.5. 사용자 인증
___7.5.1. 인증되지 않은 사용자
___7.5.2. 잘못된 자격 증명을 가진 사용자
___7.5.3. 옳은 자격 증명을 가진 사용자
___7.5.4. 권한이 맞지 않은 사용자
__7.6. 렐름 이름 변경
___7.6.1. SecurityConfig 클래스
___7.6.2. 잘못된 자격 증명을 가진 사용자 요청
_8 장. 리멤버-미 인증
__8.1. 리멤버-미 디폴트 설정과 필터 체인
__8.2. 리멤버-미 사용자 인증 프로세스
___8.2.1. 로그인 사용자 기억하기
___8.2.2. 리멤버-미 사용자 인증
__8.3. 리멤버-미 인증 컴포넌트
___8.3.1. 리멤버-미 인증 토큰
___8.3.2. 리멤버-미 인증 제공자
___8.3.3. 리멤버-미 인증 서비스
____8.3.3.1. NullRememberMeServices 클래스
____8.3.3.2. AbstractRememberMeServices 클래스
____8.3.3.3. TokenBasedRememberMeServices 클래스
____8.3.3.4. PersistentTokenBasedRememberMeServices 클래스
____8.3.3.5. 토큰 기반과 영속성 토큰의 장단점
_9장. 리멤버-미 인증 구현하기
__9.1. 프로젝트 구성
__9.2. 메인 화면 구현
___9.2.1. 메인 페이지
___9.2.2. MainController 클래스
___9.2.3. SecurityConfig 클래스
___9.2.4. 메인 화면
__9.3. 로그인 구현
___9.3.1. 로그인 페이지
___9.3.2. LoginController 클래스
___9.3.3. AppConfig 클래스
___9.3.4. SecurityConfig 클래스
___9.3.5. 사용자 로그인
__9.4. 홈 화면 구현
___9.4.1. 홈페이지
___9.4.2. HomeController 클래스
___9.4.3. 홈페이지 자동 로그아웃
__9.5. 리멤버-미 서비스와 데이터베이스 연결
___9.5.1. AppConfig 클래스
___9.5.2. SecurityConfig 클래스
___9.5.3. 영속성 토큰 테이블 사용 확인하기
_10장. 익명 인증
__10.1. 익명 인증 필터
__10.2. 익명 인증 관련 설정
___10.2.1. 인증 주체 변경
___10.2.2. 역할 이름 변경
___10.2.3. 익명 인증 비활성화
_11 장. 인증 이벤트
__11.1. 인증 이벤트 프로세스
__11.2. 인증 이벤트 참여 컴포넌트
___11.2.1. 인증 이벤트 발행자
____11.2.1.1. NullEventPublisher 클래스
____11.2.1.2. DefaultAuthenticationEventPublisher 클래스
___11.2.2. 스프링 이벤트
_12 장. 인증 이벤트 구현하기
__12.1. 프로젝트 구성
__12.2. 시큐리티 필터 체인 및 컨트롤러 준비
___12.2.1. HomeController 클래스
___12.2.2. SecurityConfig 클래스
___12.2.3. AppConfig 클래스
__12.3. 인증 성공 이벤트 리스너 구현
___12.3.1. LoginSuccessEventListener 클래스
___12.3.2. 인증 성공 이벤트 확인
__12.4. 인증 실패 이벤트 리스너 구현
___12.4.1. LoginFailureEventListener 클래스
___12.4.2. 인증 실패 이벤트 확인
3부. 인가
_13 장. 스프링 시큐리티 인가 아키텍처
__13.1. 사용자 권한
__13.2. 인가 매니저
__13.3. 레거시 인가 아키텍처
___13.3.1. 접근 결정 관리자
___13.3.2. 접근 결정 투표자
___13.3.3. 레거시 인가 처리 마이그레이션
_14 장. HTTP 요청 기반 인가
__14.1. 인가 필터
___14.1.1. 인가 필터 구성하기
___14.1.2. AuthorizationFilter 클래스
__14.2. 인증/인가 예외 처리
___14.2.1. ExceptionTranslationFilter 인스턴스와 인증/인가 예외 처리
___14.2.2. AuthenticationEntryPoint 인스턴스
__14.3. 요청 일치자
___14.3.1. 매칭 조건과 접근 가능 조건
___14.3.2. RequestMatcher 인스턴스
____14.3.2.1. AntPathRequestMatcher 클래스
____14.3.2.2. MvcRequestMatcher 클래스
____14.3.2.3. AnyRequestMatcher 클래스
____14.3.2.4. ELRequestMatcher 클래스
____14.3.2.5. RegexRequestMatcher 클래스
__14.4. HTTP 요청 기반 인가 매니저
___14.4.1. RequestMatcherDelegatingAuthorizationManager 클래스
___14.4.2. AuthenticatedAuthorizationManager 클래스
___14.4.3. AuthorityAuthorizationManager 클래스
___14.4.4. AuthoritiesAuthorizationManager 클래스와 역할 계층
_15 장. HTTP 요청 기반 인가 구현하기
__15.1. 프로젝트 구성
__15.2. 리소스 엔드포인트 및 가상 사용자 준비
___15.2.1. 리소스 엔드포인트 준비
___15.2.2. 가상 사용자 추가
__15.3. 시큐리티 필터 체인 설정
__15.4. 허용된 리소스 접근
__15.5. 거부된 리소스 접근
__15.6. 인증 접근 제어
__15.7. 권한 접근 제어
__15.8. 역할 접근 제어
__15.9. 역할 계층 접근 제어
__15.10. 복합 조건 접근 제어
___15.10.1. AuthorizationManagers 클래스
___15.10.2. 시큐리티 필터 체인 변경
_16장. 메서드 기반 인가
__16.1. 스프링 AOP
___16.1.1. 관점 지향 프로그래밍
___16.1.2. 스프링 AOP
__16.2. 인가 어드바이저
___16.2.1. 포인트컷 애너테이션과 인가 어드바이저
___16.2.2. 인가 어드바이저 동작 과정
__16.3. 메서드 기반 인가 매니저
___16.3.1. @HandleAuthorizationDenied 애너테이션
___16.3.2. @AuthorizeReturnObject 애너테이션
__16.4. 메서드 시큐리티 표현식 핸들러
___16.4.1. 평가 컨텍스트
___16.4.2. 루트 객체
__16.5. 기타 메서드 기반 인가 애너테이션들
___16.5.1. @Secured 애너테이션
___16.5.2. JSR-250 애너테이션
_17장. 메서드 기반 인가 구현하기
__17.1. 시큐리티 설정 및 가상 테스트 사용자 준비
__17.2. 리소스 및 가상 테스트 사용자 준비
___17.2.1. 서비스 객체 준비
___17.2.2. 리포지토리 객체 준비
___17.2.3. 테스트 사용자 준비
__17.3. 거부된 리소스 접근
__17.4. 사전 접근 제어
___17.4.1. 접근 제어 규칙
___17.4.2. 관리자 역할 사용자의 신규 사용자 추가
___17.4.3. 직원 역할 사용자의 신규 사용자 추가
__17.5. 사후 접근 제어
___17.5.1. 접근 제어 규칙
___17.5.2. 사용자 직원 정보 조회
__17.6. 사전 필터 처리
___17.6.1. 접근 제어 규칙 및 사전 필터링 규칙
___17.6.2. 관리자 역할 사용자의 다수 신규 사용자 추가
__17.7. 사후 필터 처리
___17.7.1. 사후 필터링 규칙
___17.7.2. 사용자 직원 정보 조회
__17.8. 역할 계층 접근 제어
_18장. 인가 이벤트
__18.1. 인가 이벤트 프로세스
__18.2. 인가 이벤트 참여 컴포넌트
_19 장. 인가 이벤트 구현하기
__19.1. 프로젝트 구성
__19.2. 시큐리티 필터 체인 및 인가 이벤트 발행자 준비
___19.2.1. SecurityConfig 클래스
___19.2.2. AppConfig 클래스
__19.3. 리소스 엔드포인트 준비
__19.4. 인가 이벤트 발행자 준비
__19.5. 인가 실패 이벤트 리스너 구현
4부. 애플리케이션 보호
_20장. 사이트 간 요청 위조
__20.1. 쿠키와 세션
___20.1.1. HTTP 무상태 특성
___20.1.2. 세션
___20.1.3. 쿠키
___20.1.4. 스프링 시큐리티의 사용자 인증 프로세스 속 쿠키와 세션
__20.2. CSRF 공격이란?
__20.3. CSRF 공격에 취약한 애플리케이션
___20.3.1. 시큐리티 필터 체인 준비
___20.3.2. 가상 사용자 준비
___20.3.3. 메인 컨트롤러
___20.3.4. 메인 페이지
___20.3.5. 사용자 역할 업데이트 컨트롤러
___20.3.6. 애플리케이션 실행
__20.4. CSRF 공격 애플리케이션
___20.4.1. 공격 페이지 컨트롤러
___20.4.2. 공격 페이지
___20.4.3. 호스트 이름 추가하기
___20.4.4. CSRF 공격하기
__20.5. CSRF 공격 방어 프로세스
___20.5.1. 스프링 시큐리티 CSRF 방어 프로세스
___20.5.2. CSRF 방어 참여 컴포넌트
____20.5.2.1. CSRF 토큰 저장소
____20.5.2.2. CSRF 토큰 요청 핸들러
__20.6. CSRF 공격 방어 프로세스 구현하기
___20.6.1. CSRF 방어 활성화하기
___20.6.2. CSRF 토큰 추가하기
___20.6.3. CSRF 방어 여부 확인하기
_21 장. 교차 출처 리소스 공유(CORS)
__21.1. 동일 출처 정책이란?
__21.2. CORS 정책이란?
___21.2.1. 단순 요청
___21.2.2. 프리플라이트 요청과 실제 요청
___21.2.3. CORS 주요 헤더
__21.3. CORS 정책 적용하기
___21.3.1. 시큐리티 필터 체인 준비
___21.3.2. 메인 컨트롤러
___21.3.3. 메인 페이지
___21.3.4. 호스트 이름 추가하기
___21.3.5. 동일 출처 요청 보내기
___21.3.6. 교차 출처 요청 보내기
___21.3.7. 허용된 교차 출처 요청 보내기
5부. Spring Security OAuth 2.0
_22 장. OAuth2.0 프레임워크와 OIDC
__22.1. OAuth 2.0 프레임워크
___22.1.1. OAuth 2.0 참여자
___22.1.2. OAuth 2.0 프로토콜 실행 흐름
__22.2. OpenID Connect
___22.2.1. OIDC 참여자
___22.2.2. ID 토큰
___22.2.3. scope
___22.2.4. OIDC 프로토콜 실행 흐름
_23 장. 스프링 시큐리티 OAuth2 로그인
__23.1. 애플리케이션 설정과 ClientRegistration 객체
___23.1.1. 애플리케이션 설정과 ClientRegistration 객체 매핑
___23.1.2. ClientRegistrationRepository 인스턴스
___23.1.3. ClientRegistration 객체
___23.1.4. 유명한 인가 제공자
__23.2. 인가 요청 리다이렉트 프로세스
___23.2.1. OAuth 2.0 프로토콜 인가 요청 리다이렉트 흐름
___23.2.2. 스프링 시큐리티 승인 허가 리다이렉트 참여 컴포넌트
__23.3. 권한 부여 승인 리다이렉트 프로세스
___23.3.1. OAuth 2.0 프로토콜 권한 부여 승인 리다이렉트 흐름
___23.3.2. 스프링 시큐리티 권한 부여 승인 리다이렉트 참여 컴포넌트
____23.3.2.1. OAuth2 로그인 인증 필터
____23.3.2.2. OAuth2 인증 제공자
____23.3.2.3. OIDC 인증 제공자
_24 장. SNS 로그인 구현하기
__24.1. 프로젝트 구성
__24.2. 클라이언트 등록
___24.2.1. 구글 클라이언트 등록
____24.2.1.1. 프로젝트 생성
____24.2.1.2. 클라이언트 애플리케이션 등록
____24.2.1.3. OAuth 동의 화면 구성
___24.2.2. 네이버 클라이언트 등록
__24.3. 클라이언트 정보 설정
__24.4. 시큐리티 필터 체인 구성
__24.5. OAuth 2.0 사용자 서비스
___24.5.1. 사용자 엔티티와 리포지토리
___24.5.2. 플랫폼별 OAuth 2.0 사용자 서비스
____24.5.2.1. 구글 OAuth 사용자 서비스
____24.5.2.2. 네이버 OAuth 사용자 서비스
___24.5.3. DemoAuthenticatedUser 레코드 클래스
___24.5.4. 다양한 플랫폼에 대한 확장성 고려하기
___24.5.5. MainController 클래스
__24.6. 홈 화면 구현
___24.6.1. application YAML 설정
___24.6.2. index HTML
___24.6.3. MainController 클래스
___24.6.4. 메인 화면
__24.7. OAuth2 로그아웃
___24.7.1. 커스텀 LogoutSuccessHandler 클래스
___24.7.2. 커스텀 LogoutSuccessHandler 컴포넌트 등록
___24.7.3. 구글 로그아웃 화면 확인
_25 장. 스프링 시큐리티 OAuth2 클라이언트
__25.1. 시큐리티 필터 체인과 oauth2Client 메서드
___25.1.1. 시큐리티 필터 체인의 차이
___25.1.2. 리다이렉트 실행 흐름의 차이
___25.1.3. OAuth2 클라이언트 커스터마이즈 컴포넌트 설정
__25.2. OAuth2AuthorizedClient 객체의 보관 및 활용
___25.2.1. OAuth2AuthorizedClient 객체
___25.2.2. OAuth2AuthorizedClientRepository 인스턴스
___25.2.3. @RegisteredOAuth2AuthorizedClient 애너테이션
__25.3. OAuth2AuthorizedClient 관리자
___25.3.1. OAuth2AuthorizedClient 관리자와 협력 컴포넌트들
___25.3.2. OAuth2AuthorizedClient 제공자
_26 장. OAuth2 클라이언트 구현하기
__26.1. KeyCloak 설치하기
___26.1.1. KeyCloak 다운로드
___26.1.2. KeyCloak 서버 실행
__26.2. KeyCloak 렐름 및 사용자 준비
___26.2.1. 렐름이란?
___26.2.2. 렐름 및 사용자 생성
__26.3. 클라이언트 애플리케이션 등록
__26.4. 프로젝트 구성
__26.5. 시큐리티 필터 체인 구성
__26.6. 폼 로그인 사용자 준비
__26.7. OAuth2AuthorizedClient 관리자 및 제공자 준비
___26.7.1. OAuth2AuthorizedClient 관리자 및 제공자
___26.7.2. 컨텍스트 속성 맵핑
___26.7.3. application YAML
__26.8. 홈 화면 만들기
___26.8.1. application YAML
___26.8.2. index HTML
___26.8.3. MainController 클래스
___26.8.4. 홈 화면
__26.9. 리소스 소유자 비밀번호 인가 구현하기
___26.9.1. 리소스 소유자 비밀번호 인가 폼
___26.9.2. 리소스 소유자 비밀번호 인가 엔드포인트
___26.9.3. 로그인 사용자 조회
___26.9.4. 키클록 사용자 저장 및 조회
___26.9.5. 키클록 인가 서버 권한 부여받기
___26.9.6. 에러 페이지
__26.10. 사용자 리스트 조회 구현하기
___26.10.1. 사용자 리스트 조회 스크립트
___26.10.2. 사용자 리스트 조회 엔드포인트
___26.10.3. 사용자 리스트 조회
___26.10.4. 키클록 사용자 권한 부여
__26.11. 토큰 재발급 구현하기
___26.11.1. 리프레시 토큰 인가 활성화
___26.11.2. 액세스 토큰 만료 시간 조정
___26.11.3. 액세스 토큰 재발급
___26.11.4. 사용자 조회 딜레이 설정
___26.11.5. 리프레시 토큰 재인가 확인
(※ 6부는 별도의 PDF 파일로 제공)
6 부. 스프링 시큐리티 테스트
_27 장. 스프링 시큐리티 테스트 지원
__27.1. 단위 테스트와 테스트 더블
___27.1.1. 단위 테스트
___27.1.2. 테스트 더블
___27.1.3. 테스트 더블의 종류
__27.2. 결합 테스트와 스프링 부트 테스트
___27.2.1. 결합 테스트
___27.2.2. 스프링 부트 테스트
__27.3. 메서드 기반 인가 지원
___27.3.1. @WithMockUser 애너테이션
___27.3.2. @WithAnonymousUser 애너테이션
___27.3.3. @WithUserDetails 애너테이션
___27.3.4. @WithSecurityContext 애너테이션
___27.3.5. 메타 애너테이션
__27.4. 스프링 MVC 테스트 지원 - 기본
___27.4.1. 테스트 사용자 지정하기
___27.4.2. CSRF 보호 지원
___27.4.3. 폼 로그인 지원
___27.4.4. HTTP 기본 인증 지원
___27.4.5. 로그아웃 지원
__27.5. 스프링 MVC 테스트 지원 - OAuth2
___27.5.1. OIDC 로그인 지원
___27.5.2. OAuth2 로그인 지원
___27.5.3. OAuth2 클라이언트 지원
찾아보기
도서 DB 제공 - 알라딘 인터넷서점 (www.aladin.co.kr)