💡 이 글은 골든래빗 《스프링 부트 3 백엔드 개발자 되기 - 자바 편》의 08장 써머리입니다.
SecurityContextPersistenctFilter 부터 시작해서 FilterSecurityInterceptor 까지 순서대로 지남(책 201~202p 참고)
각 필터에서 인증, 인가 관련 작업 처리
UsernamePasswordAuthenticationFilter : 아이디, 패스워드가 넘어오면 인증 요청을 위임하여 인증 관리, 폼 기반 로그인 시 사용됨
FilterSecurityInterceptor : AccessDecisionManager로 권한 부여 처리를 위임하여 인가 관리
책에서 구현한 UserDetailService.java의 loadUserbyUsername 메서드에 중단점을 걸고 디버깅 모드로 서버 구동 후 로그인을 진행하면 필터체인 목록을 확인할 수 있음
비밀번호 검증은 UsernamePasswordAuthenticationFilter의 attemptAuthentication 메서드가 실행되며 이루어짐
사용자의 인증, 인가 정보를 담는 인터페이스, 이를 구현한 도메인 객체(User.java)를 구성하여 회원가입/로그인 시 사용
package me.allchan.springbootdeveloper.domain;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.List;
@Table(name = "users")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false)
private Long id;
@Column(name = "password")
private String password;
@Column(name = "email", nullable = false, unique = true)
private String email;
@Builder
public User(String email, String password, String auth) {
this.email = email;
this.password = password;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return List.of(new SimpleGrantedAuthority("user"));
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return email;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}