Spring 90

[Spring Security][KoLiving] 4-2. JwtProvider

이전 포스팅에서 JwtAuthenticationFilter는 OncePerRequestFilter를 확장하여 구현하였습니다. JwtAuthenticationFilter 필터를 생성할 때 인증 작업을 AuthenticationManager에 위임해야 하나 말아야 하나 고민했습니다. AuthenticationManager는 Filter들의 인증을 담당하는 Spring Security의 중요 컴포넌트입니다. AuthenticationManager에 인증을 위임하게 될 경우 Spring Security의 인증 메커니즘 통합이 가능하여 확장성이나 유연성이 좋아집니다. 하지만 저는 AuthenticationManager에 위임하지 않고 직접 구현하였습니다. JWT는 이미 잘 정의된 표준을 가지고 있으므로 표준을 준..

[Spring Security][KoLiving] 4-1. JwtAuthenticationFilter

* 이전 포스팅에서 다루었던 JWT 토큰 기반 인증의 구현에 대한 포스팅입니다 0. Dispatch Type 서블릿 기반의 웹 애플리케이션에서 사용되는 개념으로 서블릿이나 필터로 전달될 때 요청이 어떤상황에서 처리되는 지를 나타냅니다. REQUEST 클라이언트로부터 웹 애플리케이션에 직접 요청이 들어올 때 처리되는 타입입니다. 브라우저에서 URL이나 링크를 클릭할 떄 발생하는 요청 FORWARD RequestDispatcher의 forward() 메서드를 사용하여 특정 리소스로 요청을 전달할 때 사용되는 타입입니다. 다른 서블릿이나 JSP로 넘겨 처리할 수 있습니다. INCLUDE RequestDispatcher의 include() 메서드를 사용하여 현재 처리 중인 요청에 다른 리소스의 내용을 포함할 때..

[Spring Security][KoLiving] 4. JWT 토큰 기반 인증

* 이전 포스팅에서 다루었던 JWT 토큰 설명을 참고해주세요 인증 시스템을 개발하면서 사용해야 할 기술을 정하는 중에 세션과 토큰 두개의 선택지가 있었습니다. 장점 단점 세션 - 서버에서 사용자 세션을 제어할 수 있다 - 서버에서 사용자 세션 관리를 위한 자원소모가 크다. - 세션 유지로 인해 서버의 확장성에 제약이 생길 수 있다. 토큰 - 서버의 확장성에 제약이 없다. - 플랫폼간의 인증방식을 일관되게 관리할 수 있다. - 여러 서비스간의 통합 인증이 용이하다. - 토큰이 탈취되면 클라이언트의 연결을 제어할 수 없다. - 사용자 세션을 제어할 수 없다 저희는 '토큰' 기반으로 인증을 구현하기로 결정하였습니다. '토큰' 기반의 장점과 단점을 고려하여 시스템 구현 방향을 설정하였습니다. KoLiving은 ..

[JWT] 2. AccessToken과 RefreshToken

1. AccessToken권한 토큰보안 리소스를 접근하고자 하는 유저에게 부여사용자 정의 클레임을 두어 사용할 수 있습니다. (IP 등) 유효기간보안상 을 짧은 시간으로 설정 (1시간)공격자에 의해 노출되더라도 오랜시간 사용하지 못하게 하기 위함입니다.만료 시, 재요청이 필요합니다 (만료되면 효과가 없습니다.) 2. RefreshToken권한 토큰 갱신AccessToken이 만료될 때, 새로운 AccessToken을 요청하기 위한 토큰입니다. 유효기간AccessToken과 다르게 긴 유효시간을 가집니다. 사용자 경험 향상주기적인 AccessToken 발급에 대한 사용자 인증 요청을 줄일 수 있음AccessToken이 만료되면, 클라이언트는 새로운 AccessToken을 받기위해 인증서버에 새로운 요청을..

[JWT] 1. JWT Token

1. JWTJSON 형식의 토큰 표준입니다. (RFC 7519)URL의 일부 혹은 HTTP 헤더에 포함시켜 토큰을 전달합니다. 특징경량성간결하고 크기가 작음제약된 환경에서 정보를 간단하게 전달하는데 사용됨 보안성서명된 토큰무결성 보장: 정보가 위조되지 않았음을 검증할 수 있음Algorithm: HMAC, RSA 데이터 암호화 가능 (민감데이터 보호) 자급자족필요한 정보를 자체적으로 포함하고 있음서버측에서 별도의 상태를 유지할 필요가 없음서버는 토큰의 클레임 정보를 통해 별도의 데이터베이스 조회 없이 요청을 처리할 수 있음 2. 구성{ { "alg": "HS256", "typ": "JWT" }, { "sub": "1234567890", "name": "Jo..

[Spring Security] 3-4. 인증: 로그아웃

1. 로그아웃 아키텍쳐 Spring Security는 기본적으로 로그아웃 기능을 지원합니다. 기본 URI로 GET /logout, POST /logout가 있습니다. GET /logout : 로그아웃 확인 페이지를 보여줍니다 POST /logout : 로그아웃에 필요한 CSRF Token을 제공합니다. POST /logout 로 요청할 경우, 여러 LogoutHandler가 동작하여 작업합니다. SecurityContextLogoutHandler가 HTTP Session을 무효화 합니다. SecurityContextLogoutHandler가 SecurityContextHolderStrategy를 비웁니다. SecurityContextLogoutHandler가 SecurityContextRepository..

[Spring Security] 3-3. 인증: 패스워드 저장소

1. Password Storage Spring Security는 비밀번호를 안전하게 저장하기 위해 단방향 변환만 지원합니다. 입력 패스워드를 테이블에 저장된 해시 비밀번호와 비교하는데 유용합니다. Password 보안 기술 발전과정 초기 보안 처리의 문제점 초기에는 데이터베이스의 접근제어 기능에 의존하여 보안을 처리하였으며, 패스워드를 평문으로 저장하였습니다. 그러나 악의적인 공격자들의 공격으로 인해 아이디 - 패스워드 정보가 탈취되는 위험을 내포하고 있었습니다. 입력값을 악용한 공격이 생겨났습니다. (SQL Injection) 단방향 해싱의 도입 데이터베이스에 패스워드를 단방향 해싱하여 저장하도록 권장받았습니다. 단방향 해싱 값은 노출되더라도 원본을 알아내는 것이 매우 어렵습니다. 비선형 연산, 혼돈..

[Spring Security] 3-2. 인증: 아이디 / 패스워드

1. 인증 정보 습득방식 Spring Security는 기본적으로 클라이언트로부터 인증 정보를 얻기 위한 세가지 방법을 지원합니다. 기본 인증 방식은 HttpServletRequest 객체로부터 아이디 패스워드 정보를 얻습니다. Form Basic Digest 2. 비밀번호 저장소 (Password Storage) UserDetails UserDetails는 Spring Security에서 유저의 정보를 나타내는 인터페이스입니다. 사용자가 로그인 요청을 할 경우, DaoAuthenticationProvider는 UserDetailsService를 통해 사용자의 정보를 조회합니다. UserDetailsService에 의해 UserDetails 인터페이스의 구현체가 반환됩니다. UserDetails 구현체의..

[Spring Security] 5. 예외 처리

1. ExceptionTranslationFilter 요청에 대해 SecurityFilterChain의 필터들이 보안 처리 중 발생하는 인증 혹은 인가 예외에 대한 처리를 맡습니다. 인증 예외는 AccessDeniedException, 인가 예외는 AuthenticationException 입니다. 자바 예외와 HTTP Response 의 브릿지 역할을 합니다. AuthenticationException 이 발생할 경우 AuthenticationEntryPoint을 동작시킵니다. 인증 예외에 대해 원하는 동작을 커스터마이징 할 수 있습니다. 사용자를 로그인 페이지로 리다이렉트하거나 적절한 응답코드를 반환하는 등의 작업이 가능합니다. AccessDeniedException 이 발생할 경우 anonymous..

[Spring Boot][KoLiving] 3-2 Sign-up

이전 포스팅 2. 패스워드 설정 악의적인 공격 입력된 패스워드의 데이터는 데이터베이스에 평문으로 저장되면 안됩니다. 데이터베이스가 공격받아 아이디-패스워드가 노출될 수 있습니다. SQL Injection 등 패스워드 정보를 보호하기 위해 부호화를 통한 보안 방식이 권고되었습니다. 단방향 해싱 장점 보안성 해싱 값이 노출되더라도 원본을 알아내기 어렵습니다. 비선형 연산, 혼돈, 확산 등의 성질을 근거로 해시 함수의 복구 안전성이 확보됩니다. 적은 연산 입력받은 패스워드 값이 저장된 해싱값과 일치하는지 여부를 쉽게 얻을 수 있습니다. 단점 레인보우 테이블 단방향 해시값에 대응되는 다양한 원본값을 미리 계산해둔 테이블입니다. 이를 통해 해시값과 일치하는 원본 비밀번호를 빠르게 찾을 수 있습니다. BCrypt ..

Spring/Spring Boot 2023.09.19