Home Spring Security 구조
Post
Cancel

Spring Security 구조

참고 자료

Spring Docs


들어가기 전

인증(Authentication) vs 인가(Authorization)

인증(Authentication) : 요청한 유저가 누구인지 확인하는 과정

인가(Authorization) : 인증된 유저가 권한이 있는지 확인하는 과정

Principal + Credentials

Principal은 요청의 주체를 의미한다. 즉 인증을 수행하고, 인가를 수행해야하는 요청의 주체를 말한다.

주로 ID, Email 등 이 쓰인다.

Credentials은 Principal 의 자격을 증명할 수 있는 요소를 가리킨다.

주로 비밀번호가 쓰이며, 이 요소는 변경이 가능하다.


Spring Security 구조

Spring Security 는 기본적으로 Filter 단위에서 동작한다.

즉, Spring Security 는 필터다.


1. HttpRequest

HTTP 요청이 들어오면, Authentication Filter 가 요청을 가로채어 요청에 대한 인증(Authentication) 을 진행한다.


2, 3. UsernamePasswordAuthenticationToken

요청으로 들어온 username, password 를 통하여 인증객체를 생성한다.

즉, 요청한 ID 혹은 Email 그리고 Password 를 통해 그 요청 조합에 대한 인증을 수행하는 단계이다.

UsernamePasswordAuthenticationToken 은 Authentication 이라는 인터페이스의 구현체이다.


4. Authentication Manager (Interface)

이전 단계에서 생성된 인증객체(Authentication Object) 를 통해 Authentication Manager 인증 관련 메서드를 호출할 수 있게 된다.

Authentication Manager 는 인터페이스 이며 이를 구현하는 실체는 Provider Manager 가 담당한다.

이 때, Authentication Manager 에게 입력되는 객체도 Authentication Object 로 들어올 뿐 만 아니라 인증을 수행한 뒤에도 반환 타입은 Authentication Object 이다.

위 표를 보면, 인증을 수행하기 전 Authentication 객체의 내용을 알 수 있다.

필드인증을 수행하기 전인증을 수행한 후
PrincipalusernameuserObject
GrantedAuthoritiesNot grantedCUSTOM_ROLE
Authenticatedfalsetrue

5. Authentication Provider (Interface)

여러개의 구현체를 가질 수 있는 인터페이스이다.

Authentication Provider 의 구현체들은 authenticate 메서드를 구현해야한다.

이 과정에서, UserDetailsService 가 존재하는데, 실제로 DB 에 있는 유저 정보를 꺼내서 요청한 인증 객체DB 에서 가져온 인증객체의 Credentials 를 비교한다.


6.1 UserDetailsService (Interface)

loadUserByUsername 를 가지고 있는 인터페이스이다.

username 이 String 형태로 오면, UserDetailsService 의 구현체로부터 DB에 username 에 해당하는 User 객체를 가져오는 역할을 수행하게 한다.

이 인터페이스 역시 여러개의 구현체를 가질 수 있게된다.

6.2 UserDetails (Interface)

Credentials 를 담고있는 user 객체를 가지고 있으며, 사용자의 Role (Spring Context 에서 사용하는 Role 임)을 가진다.


This post is licensed under CC BY 4.0 by the author.