· 오늘 공부한 것

Spring Security 프레임 워크

로그인

 

 

· 공부한 내용, 궁금한 내용, 부족한 내용

// Security
implementation 'org.springframework.boot:spring-boot-starter-security'

spring security 프레임워크를 build.gradle 에 추가한 모습이다. 

전에 서버에 요청을 하게 되면 controller에서 맵핑이 되어 들어갔는데 그전에 DispatcherServlet을 통과하게 된다. 여기서 이 보다 더 이전 단계가 앞에서 배운 Filter 부분인데 Spring Security도 이것을 사용한다.

Security가 Filter에서 사용되고 있는 모습이다.

 

Form login 기반을 사용할 때 username과 password를 확인하여 인증한다.

  1. 사용자가 username과 password를 제출하면 UsernamePasswordAuthenticationFilter는 인증된 사용자의 정보가 담기는 인증 객체인 Authentication의 종류 중 하나인 UsernamePasswordAuthenticationToken을 만들어 AuthenticationManager에게 넘겨 인증을 시도합니다.
  2. 실패하면 SecurityContextHolder를 비웁니다.
  3. 성공하면 SecurityContextHolder에 Authentication를 세팅합니다.

UsernamePasswordAuthenticationFilter는 Spring Security의 필터인 AbstractAuthenticationProcessingFilter를 상속한 Filter이다.
SecurityContext는 인증이 완료된 사용자의 상세 정보(Authentication)를 저장한다.

 

Spring Security를 사용한 로그인 처리 과정이다.

WebSecurityConfig 파일에서 아래와 같은 코드를 확인한다.

requestMatchers("/api/user/**").permitAll() 
인증이 필요 없는 URL들을 간편한게 허가할 수 있다.

anyRequest().authenticated()
인증이 필요한 URL들도 간편하게 처리할 수 있다.

 

UserDetailsService 인터페이스를 상속받은 UserDetailsServiceImpl에서 user 정보를 DB에서 가져와서 UserDetails를 상속받은 UserDetailsImpl 객체에 넣어준다. 이러면 로그인을 하게 되면 로그인한(인증된) 유저의 정보가 UserDetailsImpl에 담겨 있게 된다.

이것을 가져와서 사용을 할 때 controller에서 어노테이션을 사용해 주면 되는데 그것이 @AuthenticationPrincipal이다.

@Controller
@RequestMapping("/api")
public class ProductController {

    @GetMapping("/products")
    public String getProducts(@AuthenticationPrincipal UserDetailsImpl userDetails) {
        // Authentication 의 Principal 에 저장된 UserDetailsImpl 을 가져옵니다.
        User user =  userDetails.getUser();
        System.out.println("user.getUsername() = " + user.getUsername());

       return "redirect:/";
    }
}

 

 

 

 

· 오늘 서칭 한 자료

 

 

· 느낀 점

- Spring Security를 사용하면 쉽게 인증을 처리하고 로그인한 유저의 정보를 가져올 수 있었다. 하지만... 혼자서 적용할 수 있을지 의문이 든다.

- 코드스니펫 딸깍... 복붙이다... 복습하며 코드 한 줄씩 이해하는 과정이 필요할 거 같다.

- Filter를 잘 정리해 두면 controller단으로 넘어가기 전에 많은 것을 처리할 수 있을 거 같다.

반응형

'Today I Learned' 카테고리의 다른 글

2023-11-15 TIL  (0) 2023.11.15
2023-11-14 TIL  (0) 2023.11.14
2023-11-07 TIL  (0) 2023.11.07
2023-11-06 TIL  (0) 2023.11.06
2023-11-03 TIL  (0) 2023.11.03

+ Recent posts