Spring Security - 인증 객체 (1)

KwonKusang·2023년 2월 7일
0

Spring Security

목록 보기
1/2
post-thumbnail
post-custom-banner

Spring Security is a framework that provides authentication, authorization, and protection against common attacks.

Spring Docs에서 말하는 Spring Security의 정의이다. 두 개의 단어에 집중해보자.

Authentication과 Authorization

  1. 인증(Authentication) - 해당 사용자가 본인이 맞는 지를 확인
  2. 인가(Authorization) - 인증된 사용자가 요청한 자원에 접근 가능한 지를 결정

즉, 시큐리티는 인증된 사용자인지 확인하고 허용된 자원만 접근하도록 제한하는 역할을 한다.
그렇다면 시큐리티는 인증을 어떻게 구현했을까?

Security 인증 객체

시큐리티를 사용하다 보면 아래와 같은 객체들을 자주 마주치게 된다.

1. Principal

  • 유저 정보에 대한 인터페이스이다.
  • getName() 유저 이름 정도만 요구하듯 굉장히 간단하다.
public interface Principal {

    public boolean equals(Object another);
    public String toString();
    public int hashCode();
    public String getName();
    public default boolean implies(Subject subject) {
        if (subject == null)
            return false;
        return subject.getPrincipals().contains(this);
}

2. Authentication

  • Principal과 같이 인터페이스이다.
public interface Authentication extends Principal, Serializable {

	Collection<? extends GrantedAuthority> getAuthorities();
	Object getCredentials();
	Object getDetails();
	Object getPrincipal();
	boolean isAuthenticated();
	void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}

Principal: 유저 정보를 담은 객체이다. Object 타입이라 위에서 본 Principal 인터페이스가 구현된 객체라면 얼마든지 커스텀이 가능하다.
Credentials: Principal이 올바르다고 입증하는 객체이다. 일반적으로 비밀번호를 저장한다.
Authorities: 인증된 유저가 소유한 권한 목록을 저장한다.
Details: 인증 요청에 대한 부가 정보를 저장한다.
Authenticated: boolean 타입으로 인증 여부 구분한다.

Principal이 Authentication 안에 선언되어 사용되는 것처럼 보여진다. 둘을 다르게 생각하기 보다 유저 정보인증 정보가 저장된 객체라고 생각하자.

3. SecurityContext

  • Authentication 객체가 저장되는 보관소이다.
  • 해당 보관소는 ThreadLocal에 저장되어 같은 Thread라면 어디서든 접근할 수 있도록 설계되어있다.
  • 인증이 완료되면 HttpSession에 저장된다.
public interface SecurityContext extends Serializable {

	Authentication getAuthentication();
	void setAuthentication(Authentication authentication);
}

4. SecurityContextHolder

  • SecurityContext가 ThreadLocal에 저장되기 위한 객체이다.
  • 다음과 같이 SecurityContextHolder를 통해 유저 인증 객체를 가져올 수 있다.
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

cf. @AuthenticationPrincipal

그렇다면 유저 정보를 가져오기 위해 자주 사용하는 어노테이션인 @AuthenticationPrincipal의 동작을 예상해볼 수 있을 것이다.

SecurityContextHolder에 담겨있는 Authentication 객체를 꺼내 getPrincipal()를 실행한 결과를 매핑한다.


지금까지 시큐리티가 유저 정보인증 정보를 어떻게 저장하는 지 알아보았다.
다음 포스트에선 어떻게 인증, 인가를 처리하는 지 알아보고자 한다.

profile
안녕하세요! 백엔드 개발자 권구상입니다.
post-custom-banner

0개의 댓글