Spring/Security(7)
-
[Spring Security] Custom AuthenticationFilter API를 swagger로 제공하기
문제프로젝트를 진행하다가 프론트엔드 개발자분께 로그인 관련 API가 swagger 문서에 없다는 말씀을 들었고 확인해보니 적용되어 있지 않았다. springdoc은 기본적으로 Spring Security의 필터를 자동적으로 등록해주지 않는다.해결 방법1. swagger에 UsernamePasswordAuthenticationFilter 적용하기Spring Security는 기본적으로 로그인 로직을 처리하기 위해 UsernamePasswordAuthenticationFilter를 제공한다. 그리고 springdoc 개발자 분들도 이러한 요구사항을 알기 때문에 간단하게 로그인 API를 노출하는 방법을 제공한다. application.yml에서 springdoc.show-login-endpoint를 true로..
2023.05.25 -
[Spring Security] warn: SPRING_SECURITY_CONTEXT did not contain a SecurityContext but contained
문제를 만나게 된 배경 현재 프로젝트의 프론트엔드는 Next.js와 Redux를 기반으로 개발하고 있다. 그리고 로그인한 유저의 인증 정보는 Redux의 스토어에 저장된다. 이 때문에 문제가 발생한다. 유저가 브라우저를 새로고침하면 스토어가 초기화되면서 로그인 인증 정보가 사라지게 된다. 인증 정보 문제 해결 방안 백엔드 유저가 로그인 중인지를 확인할 수 있는 API를 제공한다 쿠키에 담긴 세션 ID를 기반으로 세션을 조회한다. 세션에 인증 객체가 있으면 로그인 중이었음을 알 수 있다. 인증 객체를 Body에 담아서 프론트엔드에 응답해주면 된다. 없다면 로그인되지 않은 익명 유저이다. Body에 아무것도 담지 않는다. 또는 세션 자체가 없다면 세션 시간이 끝나 세션이 만료된 유저이다. 이 또한 Body에..
2023.05.24 -
[Spring Security] 인가 흐름 및 절차
⚠️ 스프링 시큐리티의 인가는 인증 절차를 먼저 이해하는 편이 권장되므로 https://somuchthings.tistory.com/197 을 먼저 읽고 오는 것을 추천한다. 1. 인가(Authorization)란? 인가(Authorization)는 인증된(authenticated) 사용자가 요청한 자원에 대해 접근할 권한이 있는지를 판단하는 절차이다. 간단히 예를 들면 회원 사용자는 관리자 페이지에는 접근하지 못하도록 해야 한다는 규칙이 있다. 회원 사용자는 분명 서비스를 이용하도록 인증되었지만 관리자 자원에 대한 인가는 받지 못하는 것이다. 2. 스프링 시큐리티의 인가 흐름 앞선 필터를 모두 지나서 맨 마지막에 인가 처리를 담당하는 FilterSecurityInterceptor에 도달한다. 이 클래스..
2023.03.18 -
[Spring Security] 인증 흐름 및 절차
1. 들어가며 스프링 시큐리티는 여러 가지 인증을 처리할 수 있도록 확장성 있게 개발되었다. 그 중 이번에는 기본적으로 제공되는 username과 password를 이용한 form 기반의 인증을 다룰 것이다. 2. SecurityContextPersistenceFilter 인증 처리가 시작되기 전에 거치게 되는 필터이다. 이 필터는 SecurityContext가 현재 요청에 포함되어 있는지 확인하고 없다면 만들어주는 역할을 수행한다. 그리고 이 SecurityContext는 하나의 요청의 흐름이 사용자에게 응답될 때까지 유지된다. 그 기반은 ThreadLocal로 동작한다. 실제로 인증을 처리하는 필터는 이후에 등장하는 UsernamePasswordAuthenticationFilter이다. 3. Auth..
2023.03.07 -
[Spring Security] 기본 필터 소개
스프링 시큐리티는 웹 요청에 관련된 필터 체인을 제공해준다. 이 필터들이 어떤 역할을 하는지 개략적으로 알아보도록 한다. 스프링 시큐리티 기본 필터 스프링 시큐리티에서 기본적으로 제공하는 필터는 다음과 같다. 참고로 이 스프링 시큐리티의 버전은 5.7.7이다. 먼저 이 필터들이 어떤 동작을 하는지 간략히 설명하고 나서 중요한 필터들에 대해 자세히 설명하도록 하겠다. DisableEncodeUrlFilter 세션 ID가 URL에 포함되는 것을 막기 위해 HttpServletResponse를 사용해서 URL이 인코딩 되는 것을 막기 위한 필터이다. WebAsyncManagerIntegrationFilter SpringSecurityContextHolder는 기본적으로 ThreadLocal 기반으로 동작하는데..
2023.03.06 -
[Spring Security] 기본 동작 원리
1. 스프링 시큐리티란? 스프링 시큐리티는 스프링 생태계에서 지원하는 보안 관련 기능을 제공하는 프레임워크이다. 기본적으로 스프링을 백엔드로 활용한다면 보안과 관련된 부분은 서블릿 필터나 스프링 인터셉터에서 처리했다. 하지만 일일이 이런 식으로 실제 프로젝트에서 하는 것은 체계화되지 않은 부분에 불과했고 이를 스프링에서 공식적으로 제공하였다. 본격적으로 시작하기 전에 보안 용어들을 정리하고 가도록 하겠다. 인증(Authentication): 요청한 사람이 본인인지를 확인하는 절차 인가(Authorization): 인증된 사용자가 접근한 자원에 권한이 있는지를 확인하는 절차 2. 기본 동작 원리 및 흐름 스프링 시큐리티는 서블릿 필터 기반으로 동작하면서 스프링의 많은 지원을 함께 사용할 수 있도록 했다. ..
2023.03.06