Spring/Spring Security
[Spring Security] 인가 프로세스
[Spring Security] 인가 프로세스
2024.06.22스프링 시큐리티는 요청과 메서드 단위로 권한을 부여해 보안을 관리한다. 요청 기반 권한 부여는 HttpServletRequest에 대한 권한 부여를 모델링해 HttpSecurity 인스턴스를 사용해 권한 규칙을 선언할 수 있다. http.authorizeHttpRequests(authorize -> authorize .requestMatchers("/user").hasAuthority("USER") .requestMatchers("/mypage/**").hasAuthority("USER") .requestMatchers(HttpMethod.GET, "/**").hasAuthority("read") .requestMatchers(RegexRequestMatcher.regexMatch..
[Spring Security] 예외 처리
[Spring Security] 예외 처리
2024.06.12스프링 시큐리티에서 발생하는 예외는 AuthenticationException과 AccessDeniedException으로 나뉘며, ExceptionTranslationFilter가 예외를 처리한다. AuthenticationException 발생 시 SecurityContext 에서 인증 정보를 삭제하고 Authentication을 초기화한다. 필터는 authenticationEntryPoint를 실행해 인증 실패를 공통적으로 처리하고 인증을 요청할 수 있는 화면으로 이동시킨다.인증 프로세스의 요청 정보는 RequestCache, SavedRequest에 저장해 사용자가 인증을 마친 후 재사용한다. AccessDeniedException 발생 시 필터는 사용자가 익명 사용자인지를 먼저 판단하고, 익명 ..
[Spring Security] 인증 상태 영속성
[Spring Security] 인증 상태 영속성
2024.06.10사용자가 인증을 마친 이후 인증을 유지하기 위해 SecurityContextRepository 클래스를 사용한다.인증 정보와 권한은 SecurityContext에 저장되고, SecurityContext는 다시 HttpSession에 저장돼 요청 간 영속이 이루어진다. SpringContextRepository 인터페이스를 구현한 구현체로는 두 가지가 있는데, 그 중 하나가 HttpSession에 인증 상태를 저장하는 역할을 수행한다. 인증을 마친 후 요청할 때는 SecurityCOntextHolderFilter에서 컨텍스트를 로드해 인증 상태가 저장되어있는지 확인한다. public interface SecurityContextRepository { @Deprecated SecurityCon..
[Spring Security] 인증 아키텍처
[Spring Security] 인증 아키텍처
2024.06.08사용자가 요청하면 서블릿 필터인 DelegatingFilterProxy가 요청을 받아 스프링 필터 쪽으로 요청을 넘긴다. AuthenticationFilter는 Authentication 객체를 만들어 AuthenticationManager에게 넘겨준다. Manager는Provider에게 인증을 위임해 사용자의 ID / PASSWORD를 검증시키는데, 이 때 UserDetailsService 객체로 사용자 정보를 가져온다. 인증에 성공했다면 UserDetailService는UserDeatils 타입의 객체를 만들고, 이 객체는 다시 Provider로 올라간 후 Authentication 객체를 만든다. 만들어진 Authentication 객체는 SecurityContextHolder를 통해 Securi..
[Spring Security] 인증 메커니즘
[Spring Security] 인증 메커니즘
2024.05.30기본적으로 HTTP 기반 form 로그인 인증을 사용한다. @Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth.anyRequest().authenticated()) .formLogin((form) -> form .loginPage("/login") .loginProcessingUrl("/loginProcess") .defaultSuccessUrl("/", true) .failureUrl("/failed") ..
[Spring Security] 초기화 과정
[Spring Security] 초기화 과정
2024.05.27스프링 시큐리티는 애플리케이션 시작 시 수행되는 초기화 과정에서 인증이나 인가에 관련된 여러 작업을 수행한다. 스프링 시큐리티 의존성을 추가한 후 애플리케이션을 실행하면 의존성으로 내려받은 SpringBootWebSecurityConfiguration 클래스를 통해 초기 설정을 진행한다. @Configuration(proxyBeanMethods = false)@ConditionalOnDefaultWebSecuritystatic class SecurityFilterChainConfiguration { @Bean @Order(SecurityProperties.BASIC_AUTH_ORDER) SecurityFilterChain defaultSecurityFilterChain(HttpSecu..
[Spring Security6] 인증 서버 구축
[Spring Security6] 인증 서버 구축
2023.08.15페이스북, 구글, 깃허브 등 대기업들은 자신만의 OAuth2 인증 서버를 가지고 있다. 따라서 사용자의 구글 정보를 활용하는 서드 파티 애플리케이션을 개발할 때는 구글이 제공하는 Auth Server를 사용해 사용자의 정보에 안전하게 접근하거나 사용자를 인증할 수 있다. 만들어진 Auth Server를 사용하는건 쉽지만, 직접 Auth Server를 구축하는건 쉽지 않다. 애플리케이션을 개발할 때 MSA 기반으로 설계한다면 인증 서버를 다른 요소들과 독립적으로 구축해야 한다. Keycloak, Spring Security OAuth, AWS Cognito, Okta 등 여러 가지 기술을 활용해 인증 서버를 구축할 수 있다. 각 기술들은 OAuth2, OpenID Connect 등의 프로토콜을 지원하고, ..
[Spring Security6] OAuth2와 OpenID Connect
[Spring Security6] OAuth2와 OpenID Connect
2023.08.13OAuth는 웹에서의 인증과 권한 부여에 대한 개방 표준이다. (특정 기술에 대한 구현이 아니다) 한 서비스에서 사용자가 다른 서비스의 정보와 기능을 안전하게 활용할 수 있도록 권한을 부여하고 관리하기 위한 매커니즘을 제공한다. 초기의 애플리케이션은 다른 애플리케이션의 정보를 사용할 때 사용자가 해당 애플리케이션의 아이디와 비밀번호를 직접 제공해 로그인하는 방법을 사용했다. 이 방식은 보안에 취약하고 권한의 범위와 기간도 설정할 수 없다는 단점이 있고, 다양한 제3자 인증 방식이 개발됐지만 공통된 표준이 없어 다양한 방식의 인증 시스템을 다뤄야 했다. 이런 문제점을 해결하기 위해 OAuth 표준이 도입됐다. 처음에는 OAuth1이 도입됐고, 구현의 복잡성과 보안 문제가 있어 개선된 버전인 OAuth2가 ..
[Spring Security 6] 메서드 단위 권한 요청
[Spring Security 6] 메서드 단위 권한 요청
2023.08.12스프링 시큐리티는 권한 요청 및 접근 제어를 수행하는 방법으로 크게 두 가지 방법을 제공한다. 1. URL 기반 권한 요청 시큐리티 설정 클래스에서 URL을 기반으로 접근 권한을 제어한다. HttpSecurity 클래스의 authorizeRequests() 메서드를 사용해 구현한다. 2. 메서드 수준에서의 권한 요청 특정 애너테이션을 사용해 권한을 제어한다. 클래스의 메서드 단위로 권한을 제어할 수 있다. URL 기반 접근 제어만 사용하는 경우도 많지만, 보안 요구사항이 복잡한 경우 두 가지 방법을 함께 사용하기도 한다. 요청이 들어오면 URL 기반 접근 제어가 먼저 실행되고, 그 다음에 메서드 기반의 접근 제어가 수행된다. 전반적인 보안은 URL 기반으로, 세부적인 접근 제어는 메서드 수준에서 수행하자..
[Spring Security6] Json Web Token
[Spring Security6] Json Web Token
2023.08.11JsonWebToken(JWT) 는 JSON 객체를 사용해 정보를 안전하게 전송하는 방법을 의미한다. 주로 권한 부여에 사용되고, 기존 JSESSIONID 쿠키와 세션 기반 사용자 인증의 단점을 극복하기 위해 도입됐다. 기존 세션 기반 인증을 사용하는 경우 서버 측에서 사용자에 대한 정보를 세션에 저장한다. 따라서 서버를 여러 개 분산해서 사용하는 경우 확장성에 문제가 발생할 수 있고, 사용자가 많아질 경우 세션 정보 관리의 오버헤드가 커진다. JWT 기반 인증을 사용할 경우 서버는 사용자의 상태를 세션에 저장할 필요가 없다. 클라이언트의 요청마다 토큰이 포함되고, 이 토큰에는 모든 사용자 정보가 들어있다. 서버에서 세션을 저장하지 않기에 서버를 분산해도 세션 관련 문제가 발생하지 않고 서비스 간 상태를..
[Spring Security6] Authorization과 Filter
[Spring Security6] Authorization과 Filter
2023.08.09Authentication 은 사용자가 누구인지 확인하는 과정이다. 로그인 과정에서 아이디와 비밀번호를 통해 사용자를 확인하는 작업은 Authentication 이다. Authorization 은 사용자의 권한을 의미한다. 인증된 사용자가 어떤 리소스에 접근할 수 있는지 결정한다. Roles 는 권한의 집합을 의미한다. 관리자와 사용자가 Roles라면 사용자 관리, 글 열람은 Authorization 이다. 시큐리티는 GrantedAuthroity 인터페이스를 사용해 사용자에게 부여된 권한을 나타낸다. public final class SimpleGrantedAuthority implements GrantedAuthority { private static final long serialVersionUID..
[Spring Security6] CORS, CSRF
[Spring Security6] CORS, CSRF
2023.08.08브라우저는 기본적으로 Same-Origin Policy를 따르기에 브라우저에서 로드된 웹 페이지가 다른 출처의 리소스에 대한 요청을 제한한다. (보안을 위해 사용한다) Cross Origin Resource Sharing (CORS) Same-Origin Policy 제약을 특정 조건 하에 완화시키기 위한 메커니즘으로, 다른 Origin에서 실행 중인 웹 페이지가 특정 리소스에 액세스 할 수 있도록 허용한다. 애플리케이션을 개발하다 보면 외부 출처에서 리소스나 api에 접근해야 하는 경우가 있는데, CORS는 이런 요구사항을 안전하게 만족시키기 위해 도입됐다. 여기서 사용되는 origin은 통신에 사용되는 프로토콜, 도메인, 포트번호를 포함하는 개념으로 세 가지 구성 요소가 동일하다면 두 URL은 같은 ..