Spring Security란?
- Spring Security는 Spring 기반 애플리케이션의 보안을 담당하는 Spring의 하위 프레임워크이다.
- 보안과 관련된 체계적인 옵션을 제공하여, 개발자 입장에서 일일이 보안 관련 로직을 작성하지 않아도 된다는 장점이 있다.
인증(Authentication)과 인가(Authorization)
대부분의 시스템에서는 회원을 관리하고 있고, 그에 따른 인증(Authentication)과 인가(Authorization)에 대한 처리를 해야한다.
- 인증(Authentication): 해당 사용자가 본인이 맞는지 확인하는 과정이다.
- 인가(Authorization): 해당 사용자가 요청하는 자원을 실행할 수 있는 권한이 있는지를 확인하는 과정이다. 특정 페이지나 리소스에 접근할 수 있는지 권한을 확인한다.
Spring Security에서는 일반적으로 인증 절차를 거친 후에 인가 절차를 진행한다.
Spring Security에서는 이러한 인증과 인가를 위해 Principal(아이디)와 Credential(비밀번호)를 사용하는 Credential 기반의 인증 방식을 사용한다.
Spring Security 동작방법
위 아키텍쳐를 간단히 설명하면 다음과 같습니다.
- 사용자가 로그인 정보와 함께 인증 요청(Http Request)을 한다.
- AuthenticationFilter가 요청을 가로채서, 이 정보를 통해 UsernamePasswordAuthenticationToken이라는 인증용 객체를 생성한다.
- AuthenticationManager의 구현체인 ProviderManager에게 UsernamePasswordAuthenticationToken 객체를 전달한다.
- AuthenticationManager는 등록된 AuthenticationProvider(s)를 조회하여 인증을 요청한다.
- 실제 DB에서 사용자 인증정보를 가져오는 UserDetailsService에 사용자 정보를 넘겨준다.
- 넘겨받은 사용자 정보를 통해 DB에서 찾은 사용자 정보인 UserDetails 객체를 만든다. 이 때 UserDetails 객체는 인증용 객체와 도메인용 객체를 분리하지 않고 인증용 객체에 상속해서 사용하기도 한다.
- AuthenticationProvider(s)는 UserDetails를 넘겨받고 사용자 정보를 비교한다.
- 인증이 완료되면 권한 등의 사용자 정보를 담은 Authentication 객체를 반환한다.
- 다시 최초의 AuthenticationFilter에 Authentication 객체가 반환된다.
- Authentication 객체를 SecurityContext에 저장한다.
Spring Security 의존성 추가 방법
Gradle 방식:
implementation 'org.springframework.boot:spring-boot-starter-security'
Maven 방식:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Spring Security 의존성을 추가하면 위와 같이 특정 url에 접속을 할 때 인증을 받게 됩니다. 해당 로그인 화면은 Spring에서 제공하는 기본 로그인 화면이며 사용자의 설정을 통해 사용자가 직접 만든 페이지로 변경할 수 있습니다.
해당 페이지의 로그인 정보는 기본 설정으로 username은 "user"가 기본 아이디이고, 패스워드는 아래에 표시된 문자가 기본 password가 됩니다.
해당 아이디와 비밀번호를 입력하면 접속하고자 하는 url에 접속할 수 있습니다.
Reference
https://mangkyu.tistory.com/76
https://velog.io/@seongwon97/Spring-Security-Spring-Security%EB%9E%80