4. 스프링 시큐리티를 이용한 회원 가입 및 로그인

khs·2022년 6월 28일
0

스프링 시큐리티 소개

  • 웹에서 인증이란 해당 리소스에 대해서 작업을 수행할 수 있는 주체인지 확인하는 것
  • 인가는 인증 과정 이후에 일어나며 인가된 유저라면 해당 url에 대한 권한이 있기 때문에 접근이 가능한 것
    • 인증이 필요없는 경우 : 상품 상세 페이지 조회
    • 인증이 필요한 경우 : 상품 주문
    • 관리자 권한이 필요한 경우 : 상품 등록

security dependency 추가하기

  • 의존성을 추가하는 것만으로 정상적인 서비스를 할 수 없지만 모든 요청에 인증을 요구한다.

spring security 설정하기

  • WebSecurityConfigurerAdapter를 상속받는 클래스에 @EnableWebSecurity 어노테이션을 선언하면 SpringSecurityFilterChain이 자동으로 포함된다. WebSecurityConfigurerAdapter를 상속받아서 메소드 오버라이딩을 통해 보안설정을 커스터마이징할 수 있다. (현재 WebSecurityConfigurerAdapter는 사용되지 않는다. )

  • 오버라이딩한 configure 메소드를 통해서 http 요청에 대한 보안을 설정한다. 페이지 권한 설정, 로그인 페이지 설정, 로그아웃 메소드 등에 대한 설정을 작성할 수 있다.

회원가입 기능 구현하기

  • 비즈니스 로직을 담당하는 서비스 계층 클래스에 @Transactional 어노테이션을 선언하면 로직을 처리하다가 에러가 발생했을 때 변경된 데이터를 로직을 수행하기 이전 상태로 콜백시켜주준다.
  • 빈을 주입하는 방법은 @Autowired 어노테이션을 이용하거나, 필드 주입(Setter주입), 생성자 주입을 이용하는 방법이 있다. @RequiredArgsConstructor 어노테이션은 final이나 @NotNull이 붙은 필드에 생성자를 생성해준다. 빈에 생성자가 1개이고 생성자의 파라미터 타입이 빈으로 등록이 가능하다면 @Autowired 어노테이션 없이 의존성 주입이 가능하다. (밑줄친 부분 이해가 잘 안된다..)
  • UserDetailsService는 아래에 설명..!

테스트 기능

  • assertEquals(기대 값, 실제로 저장된 값)

  • Junit의 Assertions 클래스의 assertThrows 메소드를 이용하면 예외 처리 테스트가 가능하다. 첫 번째 파라미터에는 발생할 예외 타입을 넣어준다.

javax.validation

어노테이션설명
@NotEmptyNULL 체크 및 문자열의 겨우 길이가 0인지 검사
@NotBlankNULL 체크 및 문자열의 겨우 길이가 0인지 및 빈 문자열(" ")인지 검사
@Length(min=,max=)최소, 최대 길이 검사
@Null값이 NULL인지 검사

UserDetailsService

  • UserDetailsService 인터페이스는 데이터베이스에서 회원 정보를 가져오는 역할을 담당

  • loadUserByUsername() 메소드가 존재하며, 로그인할 유저의 email을 파라미터로 전달받고 UserDetail을 구현하고 있는 User 객체를 반환해준다. User객체를 생성하기 위해서 생성자로 회원의 이메일, 비민번호, role을 파라미터로 넘겨준다.

    Builder Pattern은 복잡한 객체의 생성 과정 및 표현 방법을 분리해 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴을 뜻한다.
    두가지 패턴이 존재하는데 하나는 생성자 패턴이고 또 다른 하나는 빌더 패턴이다.
    여기를 참고해보면 도움이 될 듯 하다.


SecurityConfig.java 설정


MockMvc

  • MockMvc 테스트를 위해 @AutoConfigureMockMvc 어노테이션을 선언한다.
  • MockMvc 클래스를 이용해 실제 객체와 비슷하지만 테스트에 필요한 기능만 가지는 가짜 객체를 만든다. MockMvc 객체를 이용하면 웹 브라우저에서 요청을 하는 것처럼 테스트할 수 있다. (아래는 예시)

페이지 권한 설정하기

    • 36번째 줄 : 시큐리티 처리에 HttpServletRequest를 이용한다는 것을 의미

    • 37번째 줄 : permitAll()을 통해 모든 사용자가 인증(로그인)없이 해당 경로에 접근할 수 있도록 설정 -> 메인 페이지, 회원 관련 URL, 뒤에서 만들 상품 상세 페이지, 상품 이미지를 불러오는 경로가 이에 해당

    • 38번째 줄 : /admin으로 시작하는 경로는 해당 계정이 ADMIN Role일 경우에만 접근 가능하도록 설정

    • 39번째 줄 : 위에서 설정해준 경로를 제외한 나머지 경로들은 모두 인증을 요구하도록 설정

    • 43번째 줄 : 인증되지 않은 사용자가 리소스에 접근하였을 때 수행되는 핸들러를 등록

    • 48번째 줄 : static 디렉터리의 하위 파일은 인증을 무시하도록 설정

profile
권혁상입니다. 행복코딩^_^

0개의 댓글