
최주호 강사님의 인프런 강좌 정리 및 실습한 기록
JwtAuthenticationFilter 와 동일
SecurityConfig 에서 requestMatchers 에 설정한 url 필터 가 잘 동작하는 지 확인token 이 생성되고 검증과정이 동작하는지 확인url 과 Role 을 기준으로 접근을 허용, 거부할 수 있다.
추후 OAuth2.0 를 적용한다면, 특정 메서드 별로 접근 권한을 세세하게 설정할 수 있다.
// url 필터링
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/user/**").authenticated()
.requestMatchers("/api/admin/**").hasRole(AppUserEnum.ADMIN.getValue())
.anyRequest().permitAll()
);
인증, 인가 과정에서 에러가 발생하면 authenticationEntryPoint, accessDeniedHandler 를 타게된다.
스프링 시큐리티는 거의 대부분의 인터페이스, 메서드에 default 값이 정해져있다. 해당 값을 그대로 사용하기에는 무리가 있으므로 CustomXXXXXX 식으로 직접 커스텀해서 사용하는 것이 바람직하다. (필터, 핸들러, 매니저 등등)
추후 OAuth2.0 를 적용해서 OIDC 를 사용한다면, AppUser 객체를 좀 더 세분화해서 작성해야한다. scope 가 추가되어 role 보다 좀 더 상세하게 권한을 조절할 수 있다. 대신 인증 토큰을 발급하는 각기 다른 서버에서 보내는 토큰 값이 제각각이기 때문에 파싱에 신경써야 한다.
// 인증 실패
http.exceptionHandling(exceptionHandling -> {
exceptionHandling
.authenticationEntryPoint((req, res, e) -> {
CustomResponseUtil.fail(res, "로그인이 필요합니다.", HttpStatus.UNAUTHORIZED);
}
);
}
);
// 인가 실패
http.exceptionHandling(exceptionHandling -> {
exceptionHandling
.accessDeniedHandler((req, res, e) -> {
CustomResponseUtil.fail(res, "권한이 없습니다.", HttpStatus.FORBIDDEN);
});
}
);

인증은 통과 후, 존재하지 않는 url 에 접근하는 경우
404 Not Found 에러를 기대한다.

token 값 없이 접근하는 경우
401 UnAuthorized 에러를 기대한다.

ADMIN 권한이 필요한 url 에 권한이 없는 상태로 접근하는 경우
403 Forbidden 에러를 기대한다.


filter 는 request 가 DispatcherServlet 으로 넘어가기 전에 request 를 가로챈다.
가로챈 시점에서 request, response 를 처리하는 인터페이스, 혹은 메서드는 이미 정해져있다. 그렇기 때문에 어떤 클래스가 쓰이는지 알아야 사용할 수 있다.
공식문서를 참고하거나, 선언부를 타고 들어가서 주석에 뭐라고 적혀 있는지를 차근차근 읽어보면 나와있기는 한데.. 차라리 github 에 공개된 repo 를 뒤져서 보는게 빠를 것 같다. 이해가 빠른 사람이면 굳이 강의를 통하지 않고서도 repo 만 쭉 살펴봐도 어느정도 감을 잡을 것이다.
글을 읽는 동안 많은 걸 배울 수 있었습니다.