08장 스프링 시큐리티로 로그인

올찬·2023년 10월 22일
0

💡 이 글은 골든래빗 《스프링 부트 3 백엔드 개발자 되기 - 자바 편》의 08장 써머리입니다.

핵심 키워드

스프링 시큐리티

  • 스프링 기반의 애플리케이션 보안을 담당하는 스프링의 하위 프레임워크
  • 필터 기반으로 동작하며 각 필터에서 인증, 인가와 관련된 작업을 처리
  • 기본적으로 세션 & 쿠키 방식으로 인증 처리

인증

  • 사용자의 신원을 입증하는 작업, 누구인지 확인

인가

  • 사이트의 특정 부분에 접근할 수 있는지 권한을 확인

시큐리티 필터체인

  • SecurityContextPersistenctFilter 부터 시작해서 FilterSecurityInterceptor 까지 순서대로 지남(책 201~202p 참고)

  • 각 필터에서 인증, 인가 관련 작업 처리

  • UsernamePasswordAuthenticationFilter : 아이디, 패스워드가 넘어오면 인증 요청을 위임하여 인증 관리, 폼 기반 로그인 시 사용됨

  • FilterSecurityInterceptor : AccessDecisionManager로 권한 부여 처리를 위임하여 인가 관리

  • 책에서 구현한 UserDetailService.java의 loadUserbyUsername 메서드에 중단점을 걸고 디버깅 모드로 서버 구동 후 로그인을 진행하면 필터체인 목록을 확인할 수 있음

  • 비밀번호 검증은 UsernamePasswordAuthenticationFilter의 attemptAuthentication 메서드가 실행되며 이루어짐

UserDetails

  • 사용자의 인증, 인가 정보를 담는 인터페이스, 이를 구현한 도메인 객체(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;
        }
    }

참고자료

profile
묘공단 스터디 블로그

0개의 댓글