Spring Security
Spring MVC 기반 애플리케이션의 인증(Authentication)과 인가(Authorization) 기능을 지원하는 보안 프레임워크
Spring Security로 할 수 있는 보안 강화 기능
- 사용자 인증 기능 적용
- 권한 레벨 적용
- 리소스에 대한 접근 제어
- 데이터 암호화
- SSL 적용
- 웹 보안 공격 차단
Spring Security에서 사용하는 용어 정리
- Principal(주체)
- 인증이 성공적으로 수행된 사용자의 계정 정보 - Authentication(인증)
- 사용자가 본인이 맞음을 증명하는 절차
- 사용자를 식별하기 위한 정보를 Credential(신원 증명 정보)라고 함 ex) 주민등록증 - Authorization(인가)
- 특정 리소스에 접근할 수 있도록 권한을 부여하는 것 (Role)
- 반드시 Authentication 과정이 수행된 이후에 이루어져야 함 - Access Control(접근 제어)
- 리소스에 접근하는 행위를 제어하는 것
Spring Security의 자동 구성을 통해, 내부적으로 제공해주는 디폴트 로그인 페이지가 있다.
Spring Security에서 제공해주는 디폴트 로그인 정보는 다음과 같다.
- Username : 'user'를 입력하면 됨
- Password : 애플리케이션을 실행할 때마다 출력 로그에서 확인 가능
Spring Security를 적용하기 위해서는 'spring-boot-starter-security' 추가
Spring Security Configuration을 적용하면 원하는 인증 방식과 웹 페이지에 대한 접근 권한을 설정할 수 있다.
- UserDetailsManager 인터페이스
- UserDetails를 관리 - UserDetails 인터페이스
- 인증된 사용자의 핵심 정보를 포함
- User 클래스를 이용해서 사용자의 인증 정보를 생성할 수 있음 - withDefaultPasswordEncoder()
- 사용자의 패스워드를 암호화
- Deprecated 상태로 권장되는 API는 아니지만, 테스트 환경이나 데모 환경에서만 사용함 - username()
- 사용자의 username을 설정 - password()
- 사용자의 password를 설정 - roles()
- 사용자의 역할(Role)을 지정
HTTP 보안 설정 기본
- HttpSecurity
- HTTP 요청에 대한 보안 설정을 구성하기 위한 핵심 클래스
커스텀 로그인 페이지 지정
- csrf().disable()
- CSRF(Cross-Site Request Forgery) 공격에 대한 Spring Security에 대한 설정을 비활성화
- 기본적으로 Spring Security는 아무 설정을 하지 않으면, CSRF 공격을 방지하기 위해서 클라이언트로부터 CSRF Token을 수신하고 검증
- 로컬 환경에서 진행할 때는 CSRF 공격에 대한 설정이 필요하지 않으므로 사용 (하지 않으면, 403 에러 발생) - formLogin()
- 폼 로그인 방식을 기본적인 인증 방법으로 지정 - loginPage('요청 URL')
- 미리 만들어둔 커스텀 페이지를 사용하도록 설정 - loginProcessingUrl('요청 URL')
- 로그인 인증 요청을 수행할 요청 URL을 지정 - failureUrl('커스텀 페이지 URL')
- 로그인에 실패할 경우, 어떤 화면으로 리다이렉트할 것인지 지정 - and()
- Spring Security 보안 설정을 메서드 체인 형태로 구성 - authorizeHttpRequests()
- 클라이언트의 요청이 들어오면, 접근 권한 확인 - anyRequest().permitAll()
- 클라이언트의 모든 요청에 대해 접근 허용
reqeust URI에 접근 권한 부여
- exceptionHandling()
- Exception을 처리하는 기능 - accessDeniedPage()
- 403 에러 발생 시, 파라미터로 지정한 URL로 리다이렉트 되도록 설정 - Ant Pattern에 대해
- https://ant.apache.org/manual/dirtasks.html#patterns
antMatchers("/**").permitAll()이 제일 선두에 위치하게 되면, 이후 권한 설정에 상관없이 모든 request URL에 접근이 가능하게 된다.
따라서, 더 구체적인 URL 경로부터 접근 권한을 부여하고, 덜 구체적인 URL 경로에 접근 권한을 부여하는 습관이 필요하다.
- Spring Security에서 지원하는 InMemory User는 애플리케이션 실행이 종료되면 InMember User 역시 메모리에서 사라진다. 테스트 환경이나 데모 환경에서 사용할 수 있는 방법이다.
- Spring Security는 사용자의 크리덴셜(Credential)을 암호화 하기 위한 PasswordEncoder를 제공한다.
- https://docs.spring.io/spring-security/reference/features/authentication/password-storage.html#authentication-password-storage - PasswordEncoder는 다양한 암호화 방식을 제공하며, Spring Security에서 지원하는 PasswordEncoder의 디폴트 암호화 알고리즘은 bcrypt이다.
- bcrypt https://ko.wikipedia.org/wiki/Bcrypt - Spring Security에서 SimpleGrantedAuthority를 사용해 Role 베이스 형태의 권한을 지정할 때 ‘Roll_’ + 권한명 형태로 지정해 주어야 한다.
- Spring Security에서는 Spring Security에서 관리하는 User 정보를 UserDetails로 관리한다.
- UserDetailsService는 User 정보를 로드(load)하는 핵심 인터페이스이다.
- UserDetails는 UserDetailsService에 의해 로드(load)되는 핵심 User 정보를 표현하는 인터페이스이다.
- 일반적으로 Spring Security에서는 인증을 시도하는 주체를 User라고 부른다.
- Principal은 User의 더 구체적인 정보를 의미하며, 일반적으로 Username을 의미한다.
- Custom UserDetailsService를 사용해 로그인 인증을 처리하는 방식은 Spring Security가 내부적으로 인증을 대신 처리해주는 방식이다.
- 패스워드 같은 민감한 정보는 반드시 암호화되어 저장되어야 한다.
- 패스워드는 암호화된 상태에서 복호화할 이유가 없기 때문에, 단방향 암호화 방식으로 암호화되어야 한다.
- 단방향 암호화에 대해 : https://en.citizendium.org/wiki/One-way_encryption
AutenticationProvider
- Spring Security에서 클라이언트로부터 전달받은 인증 정보를 바탕으로 인증된 사용자인지에 대한 인증 처리를 수행하는 Spring Security 컴포넌트이다.
- 인터페이스 형태로 정의되어 있으며, 다양한 유형의 AutenticationProvider 구현체를 제공한다.
DelegatingPasswordEncoder
Spring Security 5.0 이전부터 도입하여 더 유연한 구조로 PasswordEncoder를 사용할 수 있게 되었다.
장점
- 암호화 알고리즘을 따로 지정해주지 않으면, Spring Security에서 권장하는 최신 암호화 알고리즘을 사용하여 패스워드를 암호화할 수 있도록 해준다.
- 레거시 방식의 암호화 알고리즘으로 암호화된 패스워드의 검증을 지원한다.
- 언제든 암호화 방식을 변경할 수 있다. (마이그레이션 작업 필요)
'Develop > Spring' 카테고리의 다른 글
Spring Security 인증 처리 흐름 (0) | 2022.11.21 |
---|---|
Spring Security 웹 요청 흐름 (0) | 2022.11.19 |
인증/보안 기초 (1) | 2022.11.17 |
Intellij에서 MySQL 연동 및 DB에 데이터 저장 (3) | 2022.11.16 |
Spring Rest Docs - Asciidoc (0) | 2022.11.14 |