GO SOPT 서버파트 6차 세미나 과제입니다.
Spring Security는 Spring 기반의 애플리케이션에서 인증(Authentication)과 인가(Authorization)을 도와주는 프레임워크로, 보안 관련된 로직을 개발자가 하나하나 작성하지 않아도 되므로 편리하다.
Filter는 Dispatcher Servlet으로 가기 전에 적용되므로 가장 먼저 URL 요청을 받지만, Interceptor는 Dispatcher Servlet과 Controller 사이에 위치한다는 점에서 적용 시기가 다르다!
Filter는 웹 컨테이너❗️에서 관리하지만, Interceptor는 스프링 컨테이너❗️에서 관리한다는 차이가 존재
Filter에서 하는 이유도, 스프링 컨테이너까지 전달되지 않도록 방지 ❗️하여 보안을 지키기 위함이다.
Authentication을 implements한 AbstractAuthenticationToken의 하위 클래스로, User의 ID가 Principal 역할을 하고, Password가 Credential의 역할을 한다.
UsernamePasswordAuthenticationToken의 첫 번째 생성자는 인증 전의 객체를 생성하고, 두번째는 인증이 완료된 객체를 생성한다.
public abstract class AbstractAuthenticationToken implements Authentication, CredentialsContainer {
}
public class UsernamePasswordAuthenticationToken extends AbstractAuthenticationToken {
private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;
// 주로 사용자의 ID에 해당
private final Object principal;
// 주로 사용자의 PW에 해당
private Object credentials;
// 인증 완료 전의 객체 생성
public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
super(null);
this.principal = principal;
this.credentials = credentials;
setAuthenticated(false);
}
// 인증 완료 후의 객체 생성
public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
Collection<? extends GrantedAuthority> authorities) {
super(authorities);
this.principal = principal;
this.credentials = credentials;
super.setAuthenticated(true); // must use super, as we override
}
}
인증에 성공하여 생성된 UserDetails 객체는 Authentication객체를 구현한 UsernamePasswordAuthenticationToken
을 생성하기 위해 사용된다. UserDetails를 implements하여 처리할 수 있다.
public interface UserDetails extends Serializable {
// 권한 목록
Collection<? extends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
// 계정 만료 여부
boolean isAccountNonExpired();
// 계정 잠김 여부
boolean isAccountNonLocked();
// 비밀번호 만료 여부
boolean isCredentialsNonExpired();
// 사용자 활성화 여부
boolean isEnabled();
}
인증과정을 거치고 최종적으로 반환되는 객체이다. 현재 접근하는 주체의 정보와 권한을 담고 있으며, Authentication 객체는 SecurityContext에 저장된다.
SecurityContextHolder를 통해 SecurityContext에 접근하고, SecurityContext를 통해 Authentication에 접근할 수 있다.
public interface Authentication extends Principal, Serializable {
// 현재 사용자의 권한 목록을 가져옴
Collection<? extends GrantedAuthority> getAuthorities();
// credentials(주로 비밀번호)을 가져옴
Object getCredentials();
Object getDetails();
// Principal 객체를 가져옴
Object getPrincipal();
// 인증 여부를 가져옴
boolean isAuthenticated();
// 인증 여부를 설정함
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserId {
}
ElementType | 적용 대상 |
---|---|
TYPE | 클래스 및 인터페이스 |
FIELD | 클래스의 멤버 변수 |
METHOD | 메서드 |
PARAMETER | 파라미터 |
CONSTRUCTOR | 생성자 |
LOCAL_VARIABLE | 지역변수 |
ANNOTATION_TYPE | 어노테이션 타입 |
PACKAGE | 패키지 |
TYPE_PARAMETER | 타입 파라미터 |
TYPE_USE | 타입 사용 |
RetentionPolicy | 설명 |
---|---|
RUNTIME | 컴파일 이후에도 참조 가능합니다 |
CLASS | 클래스를 참조할 때 까지 유효합니다 |
SOURCE | 컴파일 이후 어노테이션 정보가 소멸됩니다 |