본문 바로가기

Spring/Security

(10)
Spring Security 11: JWT #2 이제 세션 기반 로그인이 아닌 JWT를 이용한 로그인을 코드로 적용해보자 1. 먼저 jwt를 위해 필요한 라이브러리를 추가한다. com.auth0 java-jwt 3.18.1 2. 다음으로 jwt 토큰을 구성하기 위한 설정 값들을 설정한다. jwt: header: "${헤더이름}" issuer: "${발급자}" client-secret: "${서명을 위한 키}" expiry-seconds: "${토큰 만료 시간}" @Component @ConfigurationProperties(prefix = "jwt") public class JwtConfigure { private String header; private String issuer; private String clientSecret; private i..
Spring Security 10: JWT #1 지금까지는 세션을 이용해 로그인을 구현했다. 이제는 세션을 이용하지 않고 stateless한 방식으로 로그인을 구현해보도록 하자. JWT(Json Web Token) JWT는 Stateless 상태를 유지하며, 서버에서 사용자를 식별할 수 있는 수단을 제공한다. 과정은 다음과 같다. 사용자가 인증 요청을 보낸다.(로그인) 서버에서 사용자가 성공적으로 인증되면 JWT를 반환한다. 클라이언트는 JWT를 로컬 영역에 저장하고, 이후 서버에 요청을 보낼 때 JWT를 HTTP 헤더에 포함시킨다. 서버는 클라이언트가 전달한 JWT를 통해 사용자를 식별하며 요청을 어떻게 처리할지 결정한다. JWT vs Session Stateful vs Stateless Stateful 아키텍처의 장단점 일단 Session을 사용하..
Spring Security 9: Spring Session 개요 앞선 글을 보면 알겠지만 우리는 사용자의 정보를 세션에 저장하며 로그인을 하고 있다. 현재로서는 문제가 없겠지만, 사용자가 늘어나고 트래픽이 올라간다면 문제가 생길 것이다. 1. 서버 장애시 복제본이 없는 Session 정보는 유실 된다. 2. Session은 서버 메모리를 사용하기 때문에 너무 많아질 경우 서버 메모리 부족이 발생할 수 있다. 그림을 통해 이해해보자. 즉, Application Server중 한 곳이 장애가 났을 경우 로드 밸런서에 의해 가용성은 보장되지만, 해당 서버를 사용하던 사용자는 세션을 유실해서 로그아웃이 된다는 이야기다. Session Cluster 위 문제를 해결하기 위해 Session Cluster라는 것이 나오게 됐다. 이는 세션 정보를 외부 Storage에 따로 ..
Spring Security 8: 데이터베이스를 이용해 인증하기(JPA) #2 JPA가 주는 강력한 기능들 때문에 우리는 ORM 기술로 jdbc가 아닌 JPA를 사용한다. 스프링 시큐리티도 이를 지원하는데 간단히 살펴보자. (앞서 스프링 시큐리티가 제공해주는 필터들에 대해 설명했으니 이를 이해했다면 구현은 어렵지 않다.) JPA 엔티티 매핑 앞서 작성한 테이블을 Entity 객체로 만들고 매핑한다. JPA를 공부하는 시간이 아니기 때문에 객체 매핑하는 방법은 생략하고 넘어간다. https://joyfulviper.tistory.com/81 UserService 작성 jdbc를 이용해 인증했을 때와 마찬가지로 UserDetailsService의 loadUserByName 메소드를 오버라이딩하고 이를 AuthenticationManager에 등록하면 되기 때문에 원리만 알고 있다면 간..
Spring Security 7: 데이터베이스를 이용해 인증하기(JDBC) #1 복습 https://joyfulviper.tistory.com/77 앞서 인증 처리는 AuthenticationManager 인터페이스가 하고 구현체로는 ProviderManager가 있다고 설명했다. 또한 ProviderManager에는 여러개의 AuthenticationProvider(인터페이스)가 List로 존재하며 인증 타입에 따라 List를 순회하며 인증 처리를 수행한다. 이 중 http 인증 처리를 수행할 때 가장 기본적으로 사용되는 구현체는 DaoAuthenticationProvider 이다. 데이터베이스를 이용해 인증하기 위해서는 위의 배경지식이 필요하다. 이제 구현해보자 JdbcDaoImpl DaoAuthenticationProvider 내부를 들여다 보면 사용자를 UserDetailsS..
Spring Security 6: Thread Local ThreadLocal 같은 스레드 내의 어디서든 접근 가능한 변수 스레드 내에서 작업이 완료된 후 꼭 스레드 로컬 변수를 클리어 해야함(해당 스레드를 다시 사용할 때 기존에 반납되지 않은 ThreadLocal 변수에 접근해 예상치 못한 결과를 나게 할 수 있음) Thread per request WAS는 ThradPool을 생성함 (Tomcat 기본값 200) HTTP 요청이 들어오면 Queue에 적재되고, ThreadPool 내의 특정 Thread가 Queue에서 요청을 가져와 처리하게됨 HTTP 요청은 처음부터 끝까지 동일한 Thread에서 처리됨 HTTP 요청 처리가 끝나면 Thread는 다시 ThreadPool에 반납됨 즉, WAS의 최대 동시 처리 HTTP 요청의 갯수는 ThreadPool의 갯..
Spring Security 5: Security Filter #4 인증 이벤트 인증 성공 또는 실패가 발생했을 때 관련 이벤트(ApplicationEvent)가 발생하고, 해당 이벤트에 관심있는 컴포넌트는 이벤트를 구독할 수 있다. AuthenticationEventPublisher 인증 성공 또는 실패가 발생했을 때 이벤트를 전달하기 위한 이벤트 퍼블리셔 인터페이스 기본 구현체로 DefaultAuthenticationEventPublisher 클래스가 사용됨 AuthenticationSuccessEvent — 로그인 성공 이벤트 AbstractAuthenticationFailureEvent — 로그인 실패 이벤트 (실패 이유에 따라 다양한 구체 클래스가 정의되어 있음, 각 구현체는 클래스 내에서 하위 클래스를 보면 알 수 있음) 이벤트 사용 방법은 @EventList..
Spring Security 4: Security Filter #3 인가 처리 인가 -> 권한을 부여 특정 사용자만 특정 작업을 할 수 있게 함 인가 처리는 두 개의 작업으로 구분 인증된 사용자와 권한을 매핑해야 함 예시) ROLE_USER, ROLE_ADMIN, ROLE_ANONYMOUS 보호되는 리소스에 대한 권한 확인 관리자 권한을 가진 사용자만 관리자 페이지에 접근 가능 FilterSecurityInterceptor 필터 체인 상에서 가장 마지막에 위치하며, 사용자가 갖고 있는 권한과 리소스에서 요구하는 권한을 취합하여 접근을 허용할지 결정함 실질적으로 접근 허용 여부 판단은 AccessDecisionManager 인터페이스 구현체에서 이루어짐 해당 필터가 호출되는 시점에서 사용자는 이미 AccessDecisionManager에서 인증이 완료된 상태며, Authe..