본문 바로가기
반응형

Spring/Spring Security19

스프링 시큐리티의 권한(Authorization) AOP는 관심사가 같은 코드들끼리 묶는 역할을 한다. 서로 섞지 않고 분리한다. IT초기에는 스파게티 코드들이 많았는데 권한, 트랜잭션 코드들이 비지니스 로직과 모두 묶여 있었기 때문이다. 좋은 설계를 위해 트랜잭션, 로그, 권한처리 등등을 비지니스 로직에서 분리하는 고민이 있었고 그 결과 AOP 기술이 탄생하였다. 공통의 관심사를 어떻게 분리하는가? PointCut을 통해서 advice를 삽입한다. 코드를 서로 분리해두는데, 비지니스 로직의 적절한 곳에 권한, 로그 ,트랜잭션 커밋 등이 적용될 수 있도록 진입점을 가리켜 두는 것이다. SecurityFilterChain당 1개의 AccessDecisionManager가 있으며 Method 권한 판정은 하나의 Global 위원회에서 처리한다. 스프링 시큐.. 2021. 10. 15.
권한체크 오류처리 Interceptor 권한검사는 2곳에서 가능하다. FilterSecurityInterceptor 혹은 MethodSecurityInterceptor 이며 각각 필터, 메서드에서 검사한다. 해당 검사기능들이 Filter에 있는지 Method에 있는지에 따라서 작동하는 시점이 달라지는 것이다. 2가지 Interceptor의 역할과 차이점을 알아본다. *FilterSecurityInterceptor AccessDecisionManger는 권한검사를 하며 매우 중요한 역할이다. 그 아래에 AccessVoter들이 위원회를 소집해서 조사 및 투표를 하고 들어갈 수 있으면 투표를 하고 통과하지 못하면 AccessDenied를 한다. request .antMatchers("/").permitAll() .antMat.. 2021. 10. 15.
세션관리 ( 동시접속 ) * ConcurrentSessionFilter ConcurrentSessionFilter의 동시에 접속하는 세션들에 관심이 많다. 주요 역할은 SessionRegistry에서 SessionInformation의 expired가 true인 토큰이 들어오지 못하도록 감시하고 막는 역할을 한다. (마치 동시접속 제어 효과를 누린다.) Tomcat과 같은 servlet-container에서 제공하는 Session을 Spring이 제어 할 수 없다. tomcat이 넘겨주는 세션을 SessionRegistry에서 관리한다. 특정 sessionId의 expired를 true로 마킹하면, 더이상 접근하지 못하도록 막는 역할을 한다. ConcurrentSessionFilter 클래스를 확인해서 작동방식을 알아본다. 위의.. 2021. 10. 14.
RememberMe OAUTH2나 JWT는 큰 규모의 프로젝트이므로 메모리 그리드 방식의 세션을 유지하는 방법, 로그인 유지 방법을 고려해야 한다. 이번에 정리한 RememberMe 는 세션을 이용하여 인증할텐대, 먼저 스프링에서 세션을 유지하는 필터 2개를 알아본다. * 목차 스프링에서 세션 유지하는 필터 2개 SecurityContextPersistentFilter RememberMeAuthenticationFilter TokenBasedRememberMeServices 실습 loadUserByUsername() 구현방식 PersistentTokenBasedRememberMeServices 실습 * 스프링에서 세션 유지하는 필터 2개 스프링 시큐리티는 통행증인 Authentication을 발급해주면, 통행증을 보고 권한.. 2021. 10. 12.
UserDetailsService 이전까지는 모두 계정을 인메모리에서 사용했지만, 실무에서는 DB에서 계정 정보를 가져온다. 따라서 실제로 스프링 시큐리티를 써서 서비스를 만든다고 하면, 개발자들은 UserDetails를 구현한 User 객체와 UserDeatilsService부터 만든다. 왜냐하면, UserDetailsService와 UserDeatils 구현체만 구현하면 스프링 시큐리티가 나머지는 쉽게 쓸 수 있도록 대부분 설정해주기 때문이다. 추후 Student를 UserDetails 구현체로, StudentManager를 UserDetailsService 구현체로 개선한다. (UsernamePasswordAuthenticationToken => UsernamePasswordAuthenticationFilter 오타수정) Usern.. 2021. 10. 11.
BaiscToken으로 웹/모바일 로그인 인증 구현하기 실무에서 JWT 토큰 인증 구현이 가장 일반적이지만, 웹으로 만든 사이트를 모바일에서 하이브리드 형식으로 빠른 제공을 하고 싶다면 BasicToken을 사용하고 session을 이용하면 된다. *모바일에서 MultiChainProxy 구성하기 MobileSecurityConfig에서 BasicAuthenticationFilter 방식을 사용하는데, 이는 UsernamePasswordAuthentication 으로 검사하여 해당 토큰을 인증제공자(AuthenticationProvider)에게 준다. SecurityConfig에서 CustomLoginFilter를 사용하는데 CustomLoginFilter는 Student와 Teacher의 토큰을 인증하기 위해 각각 StudentAuthentication 토.. 2021. 10. 11.
BasicAuthentication 인증 *사용하는 경우 - SPA페이지(react, vue...) - 브라우저 기반의 모바일 앱(브라우저 기반의 앱, ex:inoic) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .httpBasic(); } } * BasicAuthenticationFilter 흐름 * 동작 방식 1. GET 방식으로 /greeting을 요청했을 때, headers에 Authorization에 토큰을 Basic으로 보낸다. 2. client의 요청이DispatcherServlet으로 가기 전에 필터에서 request.. 2021. 10. 11.
authentication 메커니즘 * 인증 ( Authentication ) Authentication은 사이트에서 "통행증" 역할을 한다. Authentication을 구현하는 객체들은 대체로 메서드 이름 맨 뒤에 AuthenticationToken이 붙는다. 그래서 구현체들을 인증토큰이라고 부른다. Credentials : 인증을 위해 필요한 정보(input, 비밀번호) Principal : 인증된 결과, 인증대상(output) Details : 기타 정보, 인증 관련 주변 정보들(ip, session 관련) Authorities : 권한 정보들 (권한을 담당하는 GrantedAuthority를 구현한 객체들을 Authorities에 넣어둔다. ) Authentication 객체는 SecurityContextHolder를 통해 세션이.. 2021. 10. 8.
basic login 과정 @EnableWebSecurity(debug = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests(request -> { request .antMatchers("/").permitAll() .anyRequest().authenticated(); }); } } "/" 이외에 모든 경로는 허용이 안된다. 요청이 오면 인증을 해야 한다. 하지만, 해당 코드에는 오류가 있다. 정적인 web resource에 대해서는 경로를 열어주어야 한다. @Override p.. 2021. 10. 8.
반응형