2023.07.03.월.TIL

heeh·2023년 7월 3일

TIL

목록 보기
34/82
post-thumbnail

Spring 숙련

  • authenticationManager : 인증처리
  • securityFilterChain메서드를 Bean으로 등록 : security를 사용할 때 인가, 미인가 URL 설정 여부와 어떤 기능을 사용하겠다, 하지 않겠다의 옵션 설정을 수행
  • (PathRequest.toStaticResources().atCommonLocations()) 경로와 관련!
    • 따로 작성하지 않아도 resources 안에 들어오는 요청들을 허가
  • security를 사용하기 때문에 복잡하지 않고 몇 줄로 처리 가능!(인증, 인가)
    http.authorizeHttpRequests((authorizeHttpRequests) ->
                    authorizeHttpRequests
                            .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정
                            .anyRequest().authenticated() // 그 외 모든 요청 인증처리
            );
  • .permitAll() : resources에 들어오는 접근들에 대해 인증 처리 진행하지 않고 허가
  • .anyRequest() 그 이외에 모든 요청은 인증 처리
  • .requestMatchers("/api/user/**").permitAll() 경로 추가
    http.authorizeHttpRequests((authorizeHttpRequests) ->
                    authorizeHttpRequests
                            .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정
                            .requestMatchers("/api/user/**").permitAll()
                            .anyRequest().authenticated() // 그 외 모든 요청 인증처리
            );
    • 다양한 기능 있다!
      → .hasRole() : 특정한 권한이 있는 사용자만 허가
      → .anonymous : 익명 사용자
      → .denyAll : 모두 거부
  • 로그인 하는 순간 sessionID가 발급되고 로그인 성공 시 session정보가 security 내부에 저장
  • 저장한 sessionID 요청이 오면 security 내부 저장된 정보와 비교 = default 기능 → 맞으면 인증 처리
    • security는 session 방식으로 동작
  • 가장 많이 확인하는 Filter
    • UsernamePasswordAuthenticationFilter
  • 사용자가 username, password를 제출 → 그걸로 UsernamePasswordAuthenticationToken을 만듦 → AuthentivaionManager한테 넘김 → 인증 시도 → 실패 or 성공 → 성공하면 SecurityContextHolder에 Authentication을 세팅(저장) → 인증 처리 완료
  • Authentication이 뭐야? *자료 확인하기
    • UsernamePasswordAuthenticationToken, rnamePasswordAuthentication의 종류 중 하나
  • UserDetailsServiceImpl와 UserDetailsImpl를 커스텀하게 되면 Security의 default 로그인 기능을 사용하지 않겠다 라는 설정 → 콘솔에서 default password가 나오지 않게 됨
  • Authentication = Principal, Credenrials, Authorities
    • Authentication = UsernamePasswordAuthenticationToken
    • UsernamePasswordAuthenticationToken = Principal, Credenrials, Authorities
    • Principal = userDetails → @authenticationPrincipal
  • 중요하게 생각하고 우리가 알고 있어야 하는 부분
    → UsernamePasswordAuthenticationFilter
  • 인증, 인가 처리와 비즈니스 로직 처리/분리 → Filter
  • UsernamePasswordAuthenticationFilter : 사용자가 username과 password를 보내면 인증 객체, 즉 UsernamePasswordAuthenticationToken을 만들고 AuthenticationManager를 통해 확인하는 작업
    • Filter에 상속 받아서 직접하기! 직접하는 이유는? JWT까지 생성 해줘야 하기 때문에!
    • UsernamePasswordAuthenticationFilter는 ssesion 방식이기 때문에 우리가 직접 custom해서 만들어야 함
  • authenticate
  • AuthenticationManager가 authenticate라는 메서드를 가지고 있으며 검증, 인증 처리 역할
  • Filter를 등록하고 추가적인 값 주기
  • WebSecurityConfig 클래스의 private final AuthenticationConfiguration authenticationConfiguration; 을 통해 AuthenticationManager를 만듦
  • bean으로 등록하여 filter를 만들어 놓고 끝나는게 아니라 필터 관리/등록을 해줘야함
    // 필터 관리
    http.addFilterBefore(jwtAuthorizationFilter(), JwtAuthenticationFilter.class);
    http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    // UsernamePasswordAuthenticationFilter가 수행되기 전에 jwtAuthenticationFilter를 먼저 수행하겠습니다
            
    return http.build();
  • 인가하는 filter를 앞에 둔 이유 : 인가를 먼저 해야 함 = 로그인 하기 전에 먼저 인가, 인가가 제대로 되지 않았으면 로그인을 진행
  • Token 검증 완료, 인증처리가 되면 Filter는 문제 없이 실행
  • 두 번째로 로그인하는 Filter 위치
profile
공부하자개발하자으쌰으쌰

0개의 댓글