-
Grpc Spring Security - 1) GrpcSpringSecurity의 인증, 인가Spring 2024. 9. 21. 13:00
새롭게 신규 서버를 기존 서비스와 더불어 Grpc로도 기능을 제공해야하는 업무가 있어, 이번에 Grpc 통신을 할때 Security를 적용해보았다.
토큰을 이용한 인증, 인가를 구현하였다.
기본적으로 Spring Security와 비슷하게 동작한다.
참고로 Spring Security의 간단한 인증 인가 예외처리에 대해서는 이전에 작성한 블로그 글이 있다!
↓
https://dodop-blog.tistory.com/448
Grpc Spring boot starter의 Security 인증 인가 프로세스
나는 grpc 서비스에 인증, 인가를 구현하기 위해서 grpc-spring-boot-starter를 사용했고, 이를 위해 공식 문서를 참고했다.
spring security의 동작과 같이, 인증 인터셉터와 인가인터셉터로 구분되어있다.
- AuthenticatingServerInterceptor
- GrpcAuthenticationReader를 이용하여 인증 정보 읽음
- AuthenticationManager를 이용하여 인증 정보 부여
- AuthorizationCheckingServerInterceptor
- AccessDecisionManager를 이용해서 권한 체크
grpc-spring-boot-starter의 경우 기본적으로 spring-security를 지원하기 떄문에, 잘 알려진 어노테이션의 활용이 가능하다.
grpc-spring-boot-starter supports spring-security natively, so you can just use the well-known annotations to secure your application.
GrpcAuthenticationReader
grpc-clients의 인증을 지원하기 위해서 어떠한 인증을 허용할 것인지 GrpcAuthenticationReader를 이용해서 정의할 수 있다.
grpc-spring-boot-starter는 다음의 reader를 지원해준다.
- AnonymousAuthenticationReader
- spring의 anonymous(익명사용자) 인증에 사용됨
- spring의 AnonymousAuthenticationToken 인증 방식을 제공하는 것으로 보임
- 참고 : https://docs.spring.io/spring-security/reference/servlet/authentication/anonymous.html
- spring의 anonymous(익명사용자) 인증에 사용됨
- BasicGrpcAuthenticationReader
- Basic 인증에 사용됨
- BearerAuthenticationReader
- Oauth 및 유사 프로토콜에 사용됨
- SSLContextGrpcAuthenticationReader
- 인증서 기반 인증에 사용됨
- CompositeGrpcAuthenticationReader
- 여러 리더를 순서대로 사용할 때 사용됨
- 사용자가 인증하도록 강제하려면 해당 리더를 사용하고 인증되지 않은 사용자는 Authentication exception을 던지는 GrpcAuthenticationReader를 추가하면 됨
여기서 CompositeGrpcAuthenticationReader는 순차적으로 인증 처리를 하기 때문에, 앞서 읽은 토큰의 권한 체크를 포함한 인증이 실패하면 전체 인증이 실패하게 된다는 것에 유의 하자.
나는 Bearer 인증 방식과 또다른 헤더를 이용한 두개의 인증방식을 사용하면서, 둘중 하나의 인증에만 성공하면 인증을 성공시키고 싶었기 때문에 모두를 포함하는 커스텀 리더를 만들었다.
AuthenticationManager
reader를 통해서 인증 정보/인증을 가져오는데 성공한다면, 스프링의 AuthenticationManager에 의해 인증이 확인 된다.
public interface AuthenticationManager { Authentication authenticate(Authentication authentication) throws AuthenticationException; }
ProviderManager는 가장 많이 사용되는 AuthenticationManager 구현체로 AuthenticationProvider 인스턴스 리스트를 가지고, 차례대로 AuthenticationProvider가 null 이 아닌 인증정보를 반환할 때까지 반복한다. 만약 인증할 수 있는 AuthenticationProvider가 존재하지 않는다면, ProviderNotFoundException(Authentication Exception)이 발생한다.
AccessDecisionManager
AccessDecisionManager는 인증,요청,권한 정보를 이용해 사용자의 자원접근을 허용/거부 여부를 최종 결정하는 주체 로 Voter를 활용해서 사용자가 리소스에 접근 가능한 권한을 가지고 있는지 확인한다.
AccessDecisionManager를 구현하는 다음과 같은 전략이 있다.
- ConcensusBased
- AccessDecisionVoter가 승인하면 이전에 거부된 내용과 관계없이 접근 승인
- AffirmativeBased
- 다수의 AccessDecisionVoter가 승인하면 접근 승인
- UnanimousBased
- 모든 AccessDecisionVoter가 만장일치로 승인해야 접근 승인
이제 다음 글에서는 해당 내용을 참고하여 grpc service와 grpc client를 이용해서 security를 어떻게 구현했는지 살펴본다.
참고 ) ✨
- Spring Security의 인증 과정
'Spring' 카테고리의 다른 글
Grpc Spring Security - 3) Grpc Client에서 header를 포함한 grpc 호출하기 (3) 2024.09.21 Grpc Spring Security - 2) Grpc Service에 인증, 인가 구현하기 (0) 2024.09.21 SpringBatch) 스프링 배치 5의 변경점 (1) 2024.03.31 SpringBatch) 스프링 배치 간단 정리 (2) 2024.03.31 Spring에서 HttpServletRequest의 반복적 읽기 (feat. Filter에서는 request 교체가 가능한 이유) (0) 2023.08.22 - AuthenticatingServerInterceptor