- authenticationManager : 인증처리
- securityFilterChain메서드를 Bean으로 등록 : security를 사용할 때 인가, 미인가 URL 설정 여부와 어떤 기능을 사용하겠다, 하지 않겠다의 옵션 설정을 수행
- (PathRequest.toStaticResources().atCommonLocations()) 경로와 관련!
- 따로 작성하지 않아도 resources 안에 들어오는 요청들을 허가
- security를 사용하기 때문에 복잡하지 않고 몇 줄로 처리 가능!(인증, 인가)
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
.anyRequest().authenticated()
);
- .permitAll() : resources에 들어오는 접근들에 대해 인증 처리 진행하지 않고 허가
- .anyRequest() 그 이외에 모든 요청은 인증 처리
- .requestMatchers("/api/user/**").permitAll() 경로 추가
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
.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);
return http.build();
- 인가하는 filter를 앞에 둔 이유 : 인가를 먼저 해야 함 = 로그인 하기 전에 먼저 인가, 인가가 제대로 되지 않았으면 로그인을 진행
- Token 검증 완료, 인증처리가 되면 Filter는 문제 없이 실행
- 두 번째로 로그인하는 Filter 위치