•
이 장에서 배우는 내용
◦
스프링 시큐리티 Auto Configuration
◦
커스텀 사용자 스토리지 정의하기
◦
커스텀 로그인 페이지 만들기
◦
CSRF 공격으로부터 방어하기
◦
사용자 파악하기
•
사용자 id와 비밀번호의 조합으로 보호되는 이메일 계정이나 거래용 개인식별번호로 보호되는 증권 계좌의 어떤것이든 보안은 대부분의 어플리케이션에서 중요한 부분이다.
1. 스프링 시큐리티 활성화하기
•
스프링 부트 보안 스타터 의존성을 빌드 명세에 추가해두면 된다.
◦
이 경우, 보안 스타터를 프로젝트 빌드 파일에 추가하면 다음의 보안 구성이 제공된다.
▪
모든 HTTP 요청 경로는 인증되어야 한다.
▪
어떤 특정 역할이나 권한이 없다.
▪
로그인 페이지가 따로 없다.
▪
스프링 시큐리티의 HTTP 기본 인증을 사용해서 인증된다.
▪
사용자는 하나만 있으며 이름은 user다. 비밀번호는 암호화해 준다.
•
이번 장에서는 다음의 기능들을 만족할 수 있도록 구성해본다.
◦
스프링 시큐리티의 HTTP 인증 대화상자 대신 우리의 로그인 페이지로 인증한다.
◦
다수의 사용자를 제공하며 새로운 타코 클라우드 개곡이 사용자로 등록할 수 있는 페이지가 있어야 한다.
◦
서로 다른 HTTP 요청 경로마다 서로 다른 보안 규칙을 적용한다.
2. 스프링 시큐리티 구성하기
•
보통 SecurityConfig로 정의되는 클래스는 스프링 시큐리티의 모든 설정을 구성하는 클래스다.
◦
configure(HttpSecurity)는 HTTP 보안을 구성하는 메소드다.
◦
configure(AuthenticationManagerBuilder)는 사용자 인증 정보를 구성하는 메소드다.
3. 웹 요청 보안 처리하기
•
보안 규칙을 각 경로에 적용하려면 configure(HttpSecurity)를 사용해야 한다.
•
이 메소드는 웹 수준에서 보안을 처리하는 방법을 구성하는 데 사용된다. 이를 사용해 처리할 수 있는 항목은 다음과 같다.
◦
HTTP 요청 처리를 허용하기 전에 충족되어야할 특정 보안 조건을 구성한다.
◦
커스텀 로그인 페이지를 구성한다.
◦
사용자가 어플리케이션의 로그아웃을 수행할 수 있도록 한다.
◦
CSRF 공격으로부터 보호하도록 구성한다.
1. 웹 요청 보안 처리하기
http
.authorizedRequests()
.antMathcers("/design", "/orders")
.hasRole("ROLE_USER")
.antMathcers("/", "/**").permitAll();
Visual Basic
복사
•
authorizeRequests()는 ExpressionInterceptUrlRegistry 객체를 반환하는데, 이 객체를 사용하면 URL 경로와 패턴 및 해당 경로의 보안 요구사항을 구성할 수 있다.
•
hasRole()과 permitAll()은 요청 경로의 보안 요구를 선언하는 메소드다. 다음 표는 이때 사용 가능한 모든 메소드를 보여준다.
메소드 | 하는 일 |
access(String) | 인자로 전달된 SpEL 표현식이 true면 접근을 허용한다. |
anonymous() | 익명의 사용자에게 접근을 허용한다. |
authenticated() | 익명이 아닌 사용자로 인증된 경우, 접근을 허용한다. |
denyAll() | 무조건 접근을 거부한다. |
fullyAuthenticated() | 익명이 아니거나 또는 remember-me가 아닌 사용자로 인증되면 접근을 허용한다. |
hasAnyAuthority(String…) | 지정된 권한 중, 어느 하나라도 사용자가 갖고 있으면 접근을 허용한다. |
hasAnyRole(String…) | 지정된 역할 중, 어느 하나라도 사용자가 갖고 있으면 접근을 허용한다. |
hasAuthority(String) | 지정된 권한을 사용자가 갖고 있으면 접근을 허용한다. |
hasIpAddress(String) | 지정된 IP 주소로부터 요청이 오면 접근을 허용한다. |
hasRole(String) | 지정된 역할을 사용자가 갖고 있으면 접근을 허용한다. |
not() | 다른 접근 메소드들의 효력을 무효화한다. |
permitAll() | 무조건 접근을 허용한다. |
rememberMe() | remember-me를 통해 인증된 사용자의 접근을 허용한다. |
요약
•
스프링 시큐리티의 자동-구성은 보안을 시작하는 좋은 방법이다. 그러나 대부분의 어플리케이션에서는 보안 요구사항을 충족하기 위해 별도의 보안 구성이 필요하다.
•
사용자 정보는 여러 종류의 사용자 스토어에 저장되고 관리될 수 있다.
•
스프링 시큐리티는 자동으로 CSRF 공격을 방어한다.
•
인증된 사용자에 관한 정보는 SecuriyContext 객체를 통해서 얻거나 @AuthentifcationPrincipal을 사용해서 컨트롤러에 주입할 수 있다.