[코드로 배우는 스프링부트] chapter10. Security 연동

이용준·2023년 6월 22일
0

1. 학습 내용

  • 스프링 시큐리티에서 제공하는 로그인 처리 방식 이해
  • JPA와 연동하는 커스텀 로그인 처리
  • Thymeleaf에서 로그인 정보 활용

선수개념

  • 인증(Authentication) : 자신을 증명하는 것
  • 인가(Authorization) : 권한에 대한 승인

  • 시큐리티 설정 클래스 작성
    • 프로젝트에 맞는 별도의 시큐리디 설정 클래스 사용하는 것이 일반적
    • confing.SecurityConfig 클래스 추가

1.스프링 시큐리티 용어와 흐름

  • 시큐리티 구성 객체와 흐름 파악

위는 시큐리티 기본 구조로, 여러 개의 객체가 서로 데이터를 주고 받으며 이뤄진다.

  • 핵심은 Authentication Manager(인증 매니저)를 통해 이뤄진다.
    • 전달된 ID/PW로 실제 사용자에 대해 검증하는 행위 등
  • Authentication Provier, 인증 매니저의 동작 결정
  • UserDetailService, 실제 인증 진행

스프링 시큐리티의 핵심 개념은 인증(Authentication)인가(Authorization)으로 구성된다.

편의점에서 술을 산다고 가정해보자.

1. 사용자는 편의점에서 신분증으로 자신이 성인임을 증명한다.(인증)
2. 편의점 직원은 구매자의 신분을 확인한다.
3. 편의점 직원은 사용자가 주류를 구매할 수 있는 사람인지 판단한다.(인가)
4. 미성년자가 아닐 경우(주류 구매의 권리/권한 보유) 구매자에게 주류를 전달한다.

1 - 인증(Authentication), 자신을 증명
3 - 인가(Authorization), 권한 승인

1-1.필터와 체이닝

  • 스프링 시큐리티는 스프링 빈과 연동할 수 있는 구조로 설계
    * 일반적 필터는 별도의 클래스 상속받는 형태
  • 내부에 여러 개의 Filter Chain이라는 구조로 Request 처리
  • 개발 시 필터 확장하고 설정하면 스프링 시큐리티를 이용해 다양한 형태의 로그인 처리 가능

스프링 시큐리티의 주요 필터

1-2. 인증을 위한 AuthenticationManger

  • AuthenticationManager의 인증 처리 메서드는 파라미터/리턴 타입 Authentication으로 동일

  • 인증(Authentication) ≈ 주민번호

    ```
    로그인 과정 예시)
    1. 아이디/패스워드로 사용자가 어떤 사람인지 전달
    2. AuthenticationManager 통해 전달된 아이디/패스워드로 실제 사용자 검증
    3. UsernamePasswordAuthenticationToken이 실제 파라미터로 전달됨
    ```

    스프링 시큐리티 필터의 주요 역할은 인증 관련된 정보를 토큰이라는 객체로 만들어 전달한다는 의미

  • UsernamePasswordAuthenticationFilter 클래스 코드 中

    	```java
    	String username = obtainUsername(request);
    	username = (username != null) ? username : "";
    	username = username.trim();
    
    	String password = obtaionPassword(request);
    	password = (password != null) ? password : "";
    
    	usernamePasswordAuthenticationToken authRequest =
    		new usernamePasswordAuthenticationToken(username, password);
    	// Allow Subclassees to set the "detail" property
    	setDetails(request, authRequest);
    
    	return this.getAuthenticationManager().authenticate(authRequest);
    	```
  1. 사용자의 아이디/패스워드를 받아 ~Token 객체 생성
  2. 이를 AuthenticationManager의 authenticate()에 파라미터로 전달
    • AuthenticationManager는 다양한 인증처리 방법 제공(ex-DB 사용 or 메모리상 정보 활용 등)
  3. AuthenticationProvider를 통해 인증 처리
  4. AuthenticationProvider는 전달된 토큰 처리 여부 확인 후 authenticate() 수행
  5. ~Provider 내부 UserDetailsService는 실제 인증 위한 데이터 가져오는 역할

AuthenticationProvider와 하위 구현 클래스

AuthenticationManger내 'authentication()' 메서드는 인증 및 권한(Role) 정보 보유

1-3. 인가(Authorization)와 권한/접근 제한

  • 인증 처리 후 '사용자의 권한이 적절한가?'에 대한 처리
    승인 및 허가의 의미
    Access-Control(접근 제한)

인증/인가 처리
url 접근 -> 인증 필요 여부(필터) 판단 -> 로그인 화면 출력 -> 인증 매니저가 인증 제공자를 찾아 인증 시도 -> (제공자)UserDetailService 구현체 통한 동작

  • 인증 매니저, AuthenticationManager
  • 인증 제공자, AuthenticationProvider

2. 커스터마이징

  • 개발 시 적절하게 인증 방식 혹은 접근 제한 지정.

1) PasswordEncoder 필수(패스워드 암호화)

  • Springboot 2.0부터 지정 필수

  • BCryptPasswordEncoder 클래스가 가장 일반적

    ...
    
    String enPw = passwordEncoder.encode(password);
    boolean matchResult = password.matches(password, enPw);
    System.out.println("Result : "+ matchResult);
    ...

2) AuthenticationManager 설정

  • 인증 매니저
  • 여기서는 메모리상에 있는 데이터를 이용하는 인증 매니저(AuthenticationManager) 사용

3) 인가(Autorization) 필요한 리소스 설정

  1. 특정 URL에 접근 제한하는 방식

  2. 설정 통해 패턴 지정

    1. SecurityConfig.SecurityFilterChain() 메서드 통해 접근 제한 처리
    2. antMatchers() 패턴을 통해 원하는 자원 선택 가능
  3. 어노테이션 통해 적용

  4. CSRF 설정

  • CSRF(Cross Site Request Forgery) : 인터넷 사용자가 자신의 의지와 무관하게 공격자가 의도한 행위를 특정 웹 사이트에 요청하게 만드는 공격
  • SecurityConfig 클래스
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
      ...
      http.csrf().disable(); // CSRF 토큰 발행하지 않도록 설정
    }
    http.

3. UserDetailsService

  • 스프링 시큐리티 회원 처리 방식
    1. 회원이나 계정을 User로 표현
    2. 회원 아이디 대신 username 사용 (ID)
    3. UserDetailsService로 회원 존재만 우선적으로 가져옴
    4. 이후 password 틀리면 'Bad Credential(잘못된 자격 증명)' 리턴 (인증)
    5. 인증 이후 접근 권한 확인 후 인가 과정 실행
  • loadUserByUsername() 이라는 단 하나의 메서드 갖음
    1. username이라는 식별값으로 회원 정보 가져옴
profile
뚝딱뚝딱

0개의 댓글