본문 바로가기
반응형

Spring/Spring Security19

Authentication 아키텍쳐 *개요Authentication(인증) 아키텍처 공식문서를 확인합니다.자세한 내용은 Servlet Authentication Architecture에서 확인 가능합니다.(5.6.13-SNAPSHOT 기준)  SecurityContextHolder    스프링 시큐리티 인증 모델의 핵심은 SecurityContextHolder입니다. 인증 정보들을 저장하는 장소입니다. 스프링 시큐리티는 SecurityContextHolder가 어떻게 채워지는지 관심이 없습니다. 값이 있다면, 인증된 사용자로 활용합니다. 즉, 사용자 인증을 구현하려면 SecurityContextHolder에 직접 인증정보를 넣습니다. SecurityContext context = SecurityContextHolder.createEmpty.. 2024. 5. 21.
Spring Security 구조 메커니즘 *개요 Spring Security의 구조 메커니즘을 학습합니다. 스프링 라이브러리와 서블릿 컨테이너의 필터가 어떻게 서로 연결되어 동작하는지 학습합니다.  필터 리뷰 스프링 시큐리티의 서블릿 지원은 서블릿 Filter에 기반을 둡니다. 아래 사진은 HTTP 요청 시 핸들러의 계층입니다. 만약 사용자는 어플리케이션에 요청을 보내면 컨테이너는 FilterChain을 생성합니다. FilterChain은 Filter와 Servlet으로 이루어졌으며 URL 요청에 따라 HttpServletRequest를 수행합니다. FilterChain은 이름대로 여러 개의 필터를 체인 형태로 가질 수 있는데 순서대로 아래 방향으로 실행되면서 Filter와 Servlet의 호출을 진행하거나 막을 수 있고 HttpServletR.. 2024. 5. 17.
Security AccessDecisionManager 구현 학습하기 *개요Spring Security Authorization 구현 학습으로 좋은 설계를 확인합니다.본 내용은 Spring Security Authorization Architecture를 기반으로 작성하였습니다.(1) 추상골격 구현, (2) 인터페이스 합성 의존, (3) OCP 구현을 알아보겠습니다.  Voting-Based AccessDecisionManager Implementations 투표 기반의 권한 검사는 AccessDecisionManager가 담당하며 AbstractSecurityInterceptor에 의해 호출됩니다.    AccessDecisionManager 구현체의 "투표"를 활용해 사용자의 자원 접근 권한을 통제할 수 있습니다. decide()  구현이 핵심입니다. 권한 심사를 통과.. 2024. 5. 15.
AuthToken 사용하기 이전에는 Session으로 구성했지만, 이제는 JWT 토큰을 사용하여 시큐리티를 구성한다. 핵심은 Bearer Token을 Client에 주도록 설정하는 것이며, 로그인할 때 Token을 검사하는 것이다. @Override protected void configure(HttpSecurity http) throws Exception { JWTLoginFilter loginFilter = new JWTLoginFilter(authenticationManager(), spUserService); JWTCheckFilter checkFilter = new JWTCheckFilter(authenticationManager(), spUserService); http .csrf().disable() .sessionM.. 2021. 10. 26.
JWT 토큰 서버에서 인증된 사용자가 인증을 유지해주는 방법은 보통 세션을 사용한다. 서버 세션을 사용하면 인증된 사용자는 매우 편리하게 서비스를 이용할 수 있고, 대부분 웹 애플리케이션 서버가 세션을 지원하기 때문에 편리하다. 하지만, 서버를 여러대 둘 경우(scale out), 같은 사용자가 서로 다른 도메인의 데이터를 요청할 경우, (SSO)에는 세션을 유지하기 위한 비용이 매우 커진다. MSA는 각 서비스별로 각각의 서버를 가지고 있다. 한쪽에서 로그인을 하면 다른 쪽에서도 연속성 있게 로그인 정보를 유지해야 한다. 세션을 사용하는 경우 서버는 request 사용자에 대해 서버에 저장된 세션을 구분해서 인식해야 한다. 여러대의 서버라면 세션을 공유하거나 복사하거나 하는 전략이 필요하다. 따라서,. 서버에 사용.. 2021. 10. 26.
임시권한 부여하기 임시권한 부여를 확인하기 위해서, SecurityInterceptor의 내부 작동방식을 다시 한번 짚어보고, 임시권한을 추가해야 할 위치를 확인한다. FilterSecurityInterceptor, MethodSecurityInterceptor 2개의 Interceptor는 각각 invoke 메서드가 작동한다. public Object invoke(MethodInvocation mi) throws Throwable { InterceptorStatusToken token = super.beforeInvocation(mi); Object result; try { result = mi.proceed(); } finally { super.finallyInvocation(token); } return super... 2021. 10. 23.
@Secured 기반 권한체크 기존에는 Expression 기반의 어노테이션을 이용한 권한체크를 하였다. 기존에는 시큐리티가 @Secured로 구축된 것이 많다. 이 권한 체크들도 내부를 분석해볼만한 가치가 있다. CustomVoter도 Secured 기반으로 만들어본다. 어노테이션을 커스텀하게 만드는 것도 추가한다. SecurityInterceptor는 filter와 method 2곳에 위치하는데, AbstractSecurityInteceptor에 공통코드가 들어가있다. Filter에서 필요한 권한 검사의 내용은 MetadataSource에 있다. (Method에 필요한 것도 Method만의 MetadataSource에 있다.) MetadataSource안에 에노테이션으로 권한을 마킹한 정보들을 configAttribute라고 한다.. 2021. 10. 20.
메서드 후처리 메서드 후처리는 메서드가 결과를 리턴한 다음에 리턴된 객체를 사용자가 접근할 수 있는지 검사한다. 권한은 메서드쪽에서 MethodSecurityInterceptor를 통해서 검사한다. MethodSecurityInterceptor 에서 중요한 멤버는 아래 세가지다. AccessDecisionManager : @Secured 나 @PreAuthorize, @PreFilter 를 처리한다. (사전체크) AfterInvocationManager : @PostAuthorize, @PostFilter 를 처리한다. (사후체크) RunAsManager : 임시권한을 부여한다. AccessDecisionManager 는 Voter가 필요하여 AccessDecisionVoter가 다양한 Voter를 가지고 있지만, A.. 2021. 10. 19.
권한위원회 voter 일반적으로 권한은 AccessDecisionManager이 담당하며, 역할은 인증이 완료된 사용자가 리소스에 접근하려고 할때 해당 요청을 허용할것인지 판단하는 인터페이스이다. AccessDecisionManager의 decide()만 구현하면 끝이난다. 꼭 Voter기반으로 할 필요는 없지만 Voter를 많이 사용하기 때문에 해당 방식의 원리를 알고 있는 것이 좋다. 인터페이스 구현체는 3가지를 제공한다. AccessDecisionManger 권한 위원회는 - AffirmativeBase :여러 Voter중에 하나라도 허용되면 허용된다. (기본설정) - ConsensesBased : 다수결 - UnaminousBased : 만장일치 3가지의 종류를 가지고 있다. public void decide(Auth.. 2021. 10. 17.
반응형