• 스프링 시큐리티 3
  • 스프링 프레임워크 기반 표준 보안 솔루션

  • 피터 뮬라리엔 지음
  • 유윤선 옮김

  • 오픈소스 & 웹 시리즈 _ 026
  • ISBN: 9788992939645
  • 25,000원 | 2010년 12월 15일 발행 | 424쪽



스프링 시큐리티 3는 스프링 시큐리티 프레임워크에 대해 전면을 할애해 설명한 최초의 기술 서적이다. 이 책은 크게 두 부분으로 구성된다. 전반부에서는 보안에 대한 기본 개념을 시작으로 인증, 권한부여, 미세 접근 제어, ACL 모듈 등 스프링 시큐리티 프레임워크와 관련한 주제에 대해 하나씩 설명하고 후반부에서는 OpenID, CAS, LDAP 등 외부 시스템과의 연동을 다룬다.

이 책에서는 보안에 대한 기본 설명을 시작으로 스프링 시큐리티의 설정을 살펴보고 이어서 간단한 JSP 웹사이트를 사용해 단계적으로 스프링 시큐리티의 보안 요소를 사이트에 적용하는 법을 설명한다. 이 책을 읽고 나면 스프링 시큐리티를 활용해 보안 취약점에 대처하는 웹 보안 기능을 구현할 수 있음은 물론 CAS, 커베로스, LDAP 등과도 손쉽게 연동할 수 있다.

보안은 모든 애플리케이션의 핵심적인 부분 중 하나다. 보안에 취약한 애플리케이션은 해커의 좋은 표적이 된다. 이 책에서는 이미 충분히 검증된 스프링 시큐리티를 이용해 자바 개발자들이 웹 애플리케이션에 대한 해커의 공격을 막고 애플리케이션의 중요 자원을 보호하기 위한 완벽한 지침을 제시한다.

이 책은 스프링 시큐리티 3에 대한 상세 가이드 서적이다. 이 책에서는 실제 비즈니스 시나리오를 토대로 가장 최근에 일어나고 있는 보안 위협에 대처하는 법을 배우게 될 것이다. 아울러 LDAP, OpenID, CAS, 커베로스, 액티브 디렉터리와 같은 외부 시스템과 스프링 시큐리티를 연동하는 법도 배우게 될 것이다.

이 책에서는 보안 개념을 소개한 후 스프링 시큐리티 3를 설치하고 설정하는 것으로 시작한다. 그런 다음 JSP 기반 웹 애플리케이션을 토대로 간단한 e-커머스 웹사이트를 구현한다. 실제 비즈니스 시나리오를 토대로 예제를 진행하므로 스프링 시큐리티 3의 다양한 기능들을 경험하다 보면 어느새 스프링 시큐리티 3를 실무에 적용할 기반이 마련될 것이다.

후반부에서는 여러분이 자주 마주치게 될 법한 통합 시나리오를 다룬다. 여기서는 특정 시스템과의 연동과 관련한 복잡한 문제들을 해결하는 법을 배울 것이다. 마지막으로 기존 스프링 시큐리티 2 사용자를 위해 스프링 시큐리티 2에서 3로 마이그레이션하는 내용으로 마무리한다.

아울러 이 책에서 제시하는 실질적인 가이드와 현실적이고 손쉬운 예제는 웹 애플리케이션을 보호하는 데 스프링 시큐리티 3를 활용하고자 하는 이들에게 많은 도움이 될 것이다. 예상 독자

이 책은 웹 애플리케이션을 개발하는 자바 개발자들을 위한 책이다. 이 책의 독자는 자바, XML, 스프링 프레임워크에 익숙하다고 가정한다. 스프링 시큐리티를 처음 접하는 개발자라도 이 책을 충분히 활용할 수 있다. 이 책에서 다루는 내용

  • 보안에 취약한 애플리케이션의 설계 결함 인식
  • 기본 권한부여 및 크리덴셜 저장 기능 구현
  • 스프링 시큐리티 2에서 스프링 시큐리티 3로 자연스럽게 마이그레이션
  • LDAP, Active Directory, NTLM과 같은 엔터프라이즈 서비스와의 연동
  • 확장 및 커스터마이징을 통한 스프링 시큐리티 3의 활용
  • 인하우스 애플리케이션 및 인기 있는 자바 프레임워크와의 연동
  • 애플리케이션의 인증 및 권한부여에 가장 적합한 설정 적용

피터 뮬라리엔(Peter Mularien)

피터 뮬라리엔은 현재 중급 규모의 엔터프라이즈 소프트웨어 벤더의 설계자이자 수석 개발자이다. 피터 뮬라리엔은 웹 기반 애플리케이션 개발에 종사했으며 다양한 분야의 기술 관련 컨설턴트로 일하면서 10년 이상 주요 기업과 소형 기업들에 컨설팅을 제공했다. 자바와 스프링에 대해서 다루고 있는 그의 블로그인 "It’s Only Software"는 복잡한 기술들에 대해 개발자들이 쉽게 이해할 수 있는 내용과 튜토리얼로 인해 많은 인기를 얻고 있다. 피터는 스프링 커뮤니티 포럼의 유명 패널 중 한 명이며 전체 포스팅을 올린 사람들 중 상위 30위 안에 올라 있다.

밤 늦은 시간과 주말에도 함께 시간을 보내지 못해 미안한 나의 아내와 아이들에게 사랑과 감사의 인사를 전한다.

유윤선

IT 프리랜서 번역가로 활동하고 있다. 역서로는 『어도비 AIR 인 액션』, 『액션스크립트 3.0 완벽 가이드』, 『시작하세요! 아이패드 프로그래밍』이 있으며, 현재 플래시, 자바, 모바일 프로그래밍 등 다양한 분야에 관심을 가지고 번역을 하고 있다. http://joshy21.com/weblog에서 개인 블로그를 운영하고 있다.

 

옮긴이 글

이 책은 웹 보안에 대해 고민하는 모든 사람들에게 추천하는 책이다. 저자인 피터 뮬라리엔은 스프링 프레임워크 포럼에서 고정 패널로 활동하고 있으며 오랜 시간 동안 많은 개발자들이 올린 질문에 답하고 의견을 나누었고 개발자들이 정말 궁금한 게 뭔지 알고 있는 뛰어난 개발자다. 저자는 이 책을 읽는 독자들이 스프링 시큐리티를 최대한 쉽게 이해하게끔 각종 다이어그램을 사용해 전체적인 흐름을 보여주고 한 주제를 한 번에 하나씩 찬찬히 설명한다. 저자의 오랜 경험에서 나온 혜안은 스프링 시큐리티를 공부할 때 독자들이 피부로 느끼는 궁금증을 해소하기에 부족함이 없으며 저자가 중간 중간 주는 팁은 보안 담당 개발자라면 항상 염두에 둬야 할 내용으로 가득 차 있다.

이 책은 크게 스프링 시큐리티 프레임워크의 기본 지식을 다루는 전반부(1~7장), 외부 시스템 연동을 다루는 후반부(8~12장), 마이그레이션을 다루는 13장으로 구성된다. 이 책은 레시피 형태의 책은 아니고 처음부터 하나씩 내용을 익히다 보면 어느새 기본 지식을 튼튼히 다질 수 있게 해주는 책이다.

역자는 스프링 시큐리티를 이루는 두 축인 인증(authentication)과 권한부여(authorization)에 대한 설명이 이 책의 핵심이라고 생각한다. 우선 이 두 가지에 대한 설명을 이해하고 나면 이후의 설명은 이러한 인증, 권한부여를 어디까지 미세하게 적용하고, 어느 부분과 연동할 것인가에 관한 상세 설명으로 볼 수 있다. 역자는 이 책의 인증과 권한부여에 대한 도입부 설명이 마치 아리아드네의 실(Ariadne’s thread)과 같다고 느꼈다. 그리스 로마 신화에서 테세우스가 미노타우로스의 미로에서 아리아드네의 실을 붙잡고 미로를 무사히 빠져나올 수 있었던 것처럼 독자들도 인증과 권한부여에 대한 두 주요 주제에 대한 이 책의 설명을 이해하기만 하면 아무리 복잡한 권한 적용도 스프링 시큐리티를 통해 손쉽게 할 수 있을 거라 확신한다.

스프링 시큐리티는 말 그대로 스프링 기반의 보안 프레임워크다. 이 책에서는 스프링에 대한 기본 지식을 전제하지만 스프링에 대한 최소한의 지식(주로 스프링 웹 MVC)을 갖춘 자바 개발자라면 누구든지 이 책을 볼 수 있다. 스프링 시큐리티는 스프링의 CoC 원칙을 그대로 계승한 프레임워크다. 복잡한 설정이 싫은 개발자라면 관례를 따라 개발하면 되고, 프로젝트에서 복잡한 보안 규칙을 적용해야 한다면 단계적인 보안 선언을 통해 원하는 수준의 보안을 적용할 수 있다. CoC 원칙으로 인해 초기 기본 설정에 대한 진입 장벽은 매우 낮으며 이후 프로젝트와 관련한 보안 규칙을 원하는 대로 커스터마이징하거나 오버라이드할 수 있다. 이 책이 웹 보안으로 고민하는 많은 분들에게 아리아드네의 실 같은 책이 되기를 바란다.

  • 01장 보안에 취약한 애플리케이션의 해부
    • 보안 감사
    • 예제 애플리케이션 소개
      • JBCP 애완동물 상점 애플리케이션의 아키텍처
      • 애플리케이션 개발도구
    • 보안 감사 결과 검토
      • 인증
      • 권한부여
      • 데이터베이스 크리덴셜 보안
      • 민감한 정보
      • 전송 레벨 보안
    • 보안 문제 해결을 위한 스프링 시큐리티 3 사용
      • 왜 스프링 시큐리티인가?
    • 요약
    •  
  • 02장 스프링 시큐리티 시작하기
    • 핵심 보안 개념
      • 인증
      • 권한부여
    • 간단한 절차를 통해 애플리케이션에 보안 적용하기
      • 스프링 시큐리티 XML 설정 파일 구현하기
      • web.xml 파일에 스프링 DelegatingFilterProxy 추가하기
      • web.xml 파일에 스프링 시큐리티 XML 파일 레퍼런스 추가하기
      • 부족한 부분들에 대한 고려사항!
    • 보안은 복잡한 주제다–보호된 웹 요청의 아키텍처
      • 요청은 어떻게 처리될까?
      • auto-config가 내부적으로 하는 작업들
      • 사용자들은 어떻게 인증받을까?
      • 요청은 어떻게 권한부여를 받을까?
    • 요약
    •  
  • 03장 사용자 경험 개선
    • 로그인 페이지 커스터마이징하기
      • 커스텀 로그인 페이지 구현하기
    • 로그아웃 기능 이해하기
      • 사이트 헤더에 Log Out 링크 추가하기
      • 로그아웃 동작 원리
    • remember me
      • remember me 옵션 구현하기
      • remember me 기능의 동작원리
      • remember me 기능은 과연 안전할까?
    • 비밀번호 수정 기능 구현하기
      • 패스워드 변경 기능을 지원하도록 인 메모리 크리덴셜 스토어 확장하기
    • 요약
    •  
  • 04장 크리덴셜 안전하게 저장하기
    • 스프링 시큐리티에서 데이터베이스를 사용한 인증 적용하기
      • 데이터베이스 인증 스토어 설정하기
      • 데이터베이스 기반 인증의 동작 원리
      • 커스텀 JDBC UserDetailsService 구현하기
      • 기본으로 제공되는 JDBC 기반 사용자 관리
    • JdbcDaoImpl에 대한 고급 설정
      • 그룹 기반 권한부여 설정하기
      • 데이터베이스 인증 시 레거시 또는 커스텀 스키마 사용하기
    • 보안 패스워드 설정하기
      • 패스워드 인코딩 설정하기
      • 패스워드에 소금을 조금 치는 것은 어떨까?
    • 솔트 패스워드 설정하기
      • 패스워드 변경 기능 개선하기
      • 커스텀 솔트 소스 설정하기
    • remember me 기능을 데이터베이스로 이전하기
      • 데이터베이스에 상주하는 remember me 토큰 설정하기
      • 데이터베이스에 저장된 토큰은 더 안전할까?
    • SSL을 사용한 사이트 보안
      • SSL 사용을 위해 아파치 톰캣 설정하기
      • 자동으로 사이트 영역 보호하기
    • 요약
    •  
  • 05장 미세 접근 제어
    • 애플리케이션 기능과 보안에 대해 다시 생각하기
      • 애플리케이션 보안에 대한 기획
      • 사용자 역할 기획
      • 페이지 레벨 보안 기획하기
    • 다양한 미세 권한부여 방법
      • 스프링 시큐리티의 태그 라이브러리를 사용해 조건에 따라 콘텐츠 렌더링하기
      • 컨트롤러 로직을 사용해 조건적으로 콘텐츠 렌더링하기
      • 페이지 내 권한부여를 설정하는 가장 좋은 방법은 무엇일까?
    • 비즈니스 티어 보호하기
      • 비즈니스 메서드 보안의 기본
      • 메서드 보안의 여러가지 방식
      • 메서드 보안의 동작 원리
    • 고급 메서드 보안
      • 빈 데코레이터를 사용한 메서드 보안 규칙
      • 메서드 파라미터를 포함하는 메서드 보안 규칙
      • 메서드 파라미터 바인딩의 동작 원리
    • 역할 기반 필터링을 통해 메서드 데이터 보호하기
      • 메서드 보안에 대한 합리적인 경고
    • 요약
    •  
  • 06장 고급 설정과 확장
    • 커스텀 보안 필터 작성하기
      • 서블릿 필터 레벨에서의 IP 필터링
    • 커스텀 AuthenticationProvider 작성하기
      • AuthenticationProvider를 사용해 간단한 싱글 사인 온 구현하기
      • 여러 AuthenticationProvider 결합하기
      • 요청 헤더를 사용해 싱글 사인 온 시뮬레이션하기
      • 커스텀 AuthenticationProvider의 사용 시점에 대한 고려사항
    • 세션 관리와 동시성
      • 세션 고정 보호 설정하기
      • 동시 세션 제어를 통해 사용자 보안 강화하기
      • 동시 세션 제어의 다른 장점들
    • 예외 처리 이해하고 설정하기
      • 접근 거부 처리 설정하기
      • AccessDeniedException을 일으키는 원인
      • AuthenticationEntryPoint의 중요성
    • 수동으로 스프링 시큐리티 인프라스트럭처 빈 설정하기
      • Spring Security 빈 의존관계의 전체적인 설명
      • 웹 애플리케이션 재설정하기
      • 최소 스프링 시큐리티 환경 설정하기
    • 고급 스프링 시큐리티 빈 기반 설정
      • 세션 라이프사이클과 연관된 요소들 조정하기
      • 다른 서비스들에 대한 수동 설정
      • SpEL 표현식 핸들러와 Voter를 사용한 명시적 설정
      • 메서드 보안에 대한 빈 기반 설정
      • 명시적인 설정 마무리하기
      • 어떤 방식의 설정을 택해야 할까?
    • 인증 이벤트 처리
      • 인증 이벤트 리스너 설정하기
      • 수많은 애플리케이션 이벤트들
    • SpEL 표현식 핸들러의 커스텀 구현체 개발하기
    • 요약
    •  
  • 07장 접근 제어 목록
    • 비즈니스 객체 보안에 접근 제어 목록 사용하기
      • 스프링 시큐리티에서의 접근 제어 목록
    • 스프링 시큐리티 ACL 지원 기능을 위한 기본 설정
      • 간단한 대상 시나리오 가정하기
      • HSQL 데이터베이스에 ACL 테이블 추가하기
      • 접근 결정 관리자 설정하기
      • ACL 지원 빈 설정하기
      • 간단한 ACL 엔트리 생성하기
    • 고급 ACL 주제들
      • 퍼미션의 동작 원리
      • 커스텀 ACL 퍼미션 선언
      • 스프링 시큐리티 JSP 태그 라이브러리를 사용해 JSP에서
      • ACL 활성화하기
      • ACL을 지원하는 스프링 표현식 언어
      • 뮤터블 ACL과 권한부여
      • Ehcache ACL 캐싱
    • 일반적인 ACL 디플로이에 대한 고려
      • ACL 규모의 확장성과 성능 모델링
      • 커스텀 개발에 들어가는 비용을 간과하지 말자
      • 스프링 시큐리티 ACL을 꼭 사용해야 할까?
    • 요약
    •  
  • 08장 OpenID에 대한 개방
    • OpenID라는 약속의 땅
      • OpenID 가입
    • 스프링 시큐리티에서의 OpenID 인증 사용
      • OpenID 로그인 폼 작성
      • 스프링 시큐리티에서의 OpenID 지원 기능 설정
      • OpenID 사용자 추가하기
    • OpenID 사용자 등록 문제
      • OpenID 식별자가 해석되는 과정
      • OpenID를 이용한 사용자 등록 구현
    • 어트리뷰트 교환
      • 스프링 시큐리티 OpenID에서의 AX 사용
      • 현실에서의 AX 지원과 제약
      • 구글 OpenID 지원
    • OpenID는 안전할까?
    • 요약
    •  
  • 09장 LDAP 디렉터리 서비스
    • LDAP 이해
      • LDAP
      • 일반 LDAP 어트리뷰트 이름
      • 임베디드 LDAP 서버 실행
    • 기본 LDAP 연동 설정
      • LDAP 서버 레퍼런스 설정하기
      • LDAP AuthenticationProvider 사용
      • 임베디드 LDAP 문제 해결
    • 스프링 LDAP 인증 방식 이해
      • 사용자 크리덴셜 인증
      • 사용자 역할 멤버십 판단
      • UserDetails의 추가 어트리뷰트 매핑
    • 고급 LDAP 설정
      • 예제 JBCP LDAP 사용자
      • 비밀번호 비교 vs. 바인딩 인증
      • UserDetailsContextMapper 설정
      • 또 다른 password 어트리뷰트 사용
      • LDAP을 UserDetailsService로 사용
    • 외부 LDAP 서버와의 연동
    • 명시적 LDAP 빈 설정
      • 외부 LDAP 서버 레퍼런스 설정
      • LdapAuthenticationProvider 설정
      • LDAP을 통한 마이크로소프트 액티브 디렉터리와의 연동
      • UserDetailsService에 역할 검색 위임
    • 요약
    •  
  • 10장 CAS를 활용한 싱글 사인 온
    • CAS 소개
      • 고수준 CAS 인증 흐름
      • 스프링 시큐리티와 CAS
      • CAS 설치와 설정
    • 기본 CAS 연동 설정
      • CasAuthenticationEntryPoint 추가
      • CAS 티켓 검증 사용
      • CasAuthenticationProvider를 활용한 진위성 증명
    • 고급 CAS 설정
      • CAS 단언으로부터의 어트리뷰트 조회
      • 어트리뷰트 조회가 왜 유용할까?
      • 추가적인 CAS의 기능들
    • 요약
    •  
  • 11장 클라이언트 인증서 인증
    • 클라이언트 인증서 인증의 동작 원리
    • 클라이언트 인증서 인증 인프라스트럭처 설정
      • 공개 키 인프라스트럭처의 용도 이해
      • 클라이언트 인증서 키 쌍 생성하기
      • 톰캣 트러스트 스토어 설정
      • 브라우저로 인증서 키 쌍 불러오기
      • 테스트 마무리
      • 클라이언트 인증서 인증 문제 해결
    • 스프링 시큐리티에서의 클라이언트 인증서 인증 설정
      • security 네임스페이스를 사용한 클라이언트 인증서 인증 설정
      • 스프링 시큐리티가 인증서 정보를 사용하는 원리
      • 스프링 시큐리티 인증서 인증의 동작 원리
      • 나머지 부족한 부분들
      • 듀얼 모드 인증 지원
    • 스프링 빈을 사용한 클라이언트 인증서 설정
      • 빈 기반 설정의 추가 기능
    • 클라이언트 인증서 인증 구현 시 고려 사항-
    • 요약
    •  
  • 12장 스프링 시큐리티 확장 프로젝트
    • 스프링 시큐리티 확장 프로젝트
    • 커베로스와 SPNEGO 인증에 대한 기초 지식
    • 스프링 시큐리티에서의 커베로스 인증
      • 전체적인 커베로스 스프링 시큐리티 인증 흐름
      • 준비 작업
      • 커베로스 관련 스프링 빈 설정
      • SPNEGO 빈을 security 네임스페이스에 연결하기
      • 애플리케이션 서버 장비를 커베로스 영역에 추가
      • 파이어폭스 사용자들에 대한 고려 사항
      • 문제 해결
    • 커베로스와의 연동을 위한 LDAP UserDetailsService 설정
    • 커베로스와 함께 폼 로그인 사용하기-
    • 요약
    •  
  • 13장 스프링 시큐리티 3으로 마이그레이션하기
    • 스프링 시큐리티 2에서 마이그레이션하기
    • 스프링 시큐리티 3의 개선 사항
    • 스프링 시큐리티 3에서의 설정 변화
      • AuthenticationManager 설정 수정
      • 세션 관리 옵션을 위한 새로운 설정 구문
      • 커스텀 필터 설정에 대한 변경사항
      • CustomAfterInvocationProvider에 대한 변경 사항
      • 그 밖의 설정 변경 사항
    • 패키지와 클래스 관련 변경 사항
    • 요약
    •  
  • 부록 추가 참고 자료
    • JBCP Pets 예제 코드 시작하기
    • 사용 가능한 애플리케이션 이벤트
    • 스프링 시큐리티 가상 URL
    • 메서드 보안을 위한 명시적인 빈 설정
    • 논리적인 필터명의 마이그레이션 참고 사항
  • p40, 23째줄

    어트리뷰는 --> 어트리뷰트는

  • p90, 26째줄

    레거시 시키마에 --> 레거시 스키마에

  • p122, 2째줄

    라이브러를 --> 라이브러리를

  • p163, 8째줄

    빈(bean)3 속성들은 --> 3개의 빈(bean) 속성들은

  • p167, 9째줄

    o.s.s.web.session.SessionManagerFilter --> o.s.s.web.session.SessionManagementFilter

  • p171, 19째줄

    ApplicationListner를 --> ApplicationListener를

  • p233, 18째줄

    기본 PermissionEvaluator 구현체에서는 모든 퍼미션 체크를 부인하는 일만 처리한다 ==> 기본 PermissionEvaluator는 아무런 퍼미션 체크도 하지 않는다

  • p278, 4째줄

    group-searchbase --> group-search-base

  • p288, 19째줄

    JDBCP --> JBCP

  • p354, 7째줄

    HTTP/완전한.웹.서버.이름 --> HTTP/<완전한 웹 서버 이름>

  • p360, 3째줄

    .trusteduris --> .trusted-uris

예제코드 관련 GitHub 페이지

도서 소개자료

관련 글