Spring(21)
-
[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 Boot] 자동 구성에 의한 H2 Default URL 변경
스프링 개발자라면 대부분 로컬 환경에서 인메모리 DB로 H2로 테스트를 많이 한다. H2는 따로 설정하지 않으면 기본 설정은 다음과 같다. driver: org.h2.Driver url - jdbc:h2:mem:testdb username: sa password: 라고 알고 있었는데 기본 url로 접속이 안 되는 현상을 발견했다. 왜 이런가 생각하면서 혹시 스프링부트가 기본적으로 설정을 따로 해주는가 하고 처음 서버 구동 시 나오는 로그를 살펴봤는데 여기서 해답을 찾을 수 있었다. 스프링부트 자동 설정 구성에서 H2의 기본 URL을 바꿔버렸다. 참고로 테스트하던 스프링 부트 버전은 2.7.9 이다. url을 변경하고 다시 연결 테스트를 해보면 성공한다. application.yml에서 별다른 설정을 하지..
2023.03.19 -
[Spring Security] 인가 흐름 및 절차
⚠️ 스프링 시큐리티의 인가는 인증 절차를 먼저 이해하는 편이 권장되므로 https://somuchthings.tistory.com/197 을 먼저 읽고 오는 것을 추천한다. 1. 인가(Authorization)란? 인가(Authorization)는 인증된(authenticated) 사용자가 요청한 자원에 대해 접근할 권한이 있는지를 판단하는 절차이다. 간단히 예를 들면 회원 사용자는 관리자 페이지에는 접근하지 못하도록 해야 한다는 규칙이 있다. 회원 사용자는 분명 서비스를 이용하도록 인증되었지만 관리자 자원에 대한 인가는 받지 못하는 것이다. 2. 스프링 시큐리티의 인가 흐름 앞선 필터를 모두 지나서 맨 마지막에 인가 처리를 담당하는 FilterSecurityInterceptor에 도달한다. 이 클래스..
2023.03.18 -
[Spring] FactoryBean
접하게 된 계기 강의를 듣던 중 강사님께서 DB에서 값을 받아오기 위한 빈을 FactoryBean을 구현해서 만드는 것을 보게 되었다. 평소에 @Component나 @Configuration, @Bean을 통해서 빈을 생성했는데 이렇게 만드는 방법도 있다는 것을 보게 되었다. 스프링의 빈 등록 스프링은 지정된 클래스 이름을 가지고 Reflection API를 이용해서 빈을 생성한다. 내부적으로 빈 정의에 나오는 클래스 이름을 가지고 빈을 생성한다. 문제 스프링에서 DI할 수 없는 클래스의 빈이 있을 수 있다. 예를 들어 클래스 정보를 미리 알아낼 수 없는 경우이다. Java에서는 Dynamic Proxy로 만드는 객체의 경우 클래스가 무엇인지 미리 알 수 없다. 클래스 자체도 내부적으로 새로 정의해서 사..
2023.03.15 -
[Spring Security] 인증 흐름 및 절차
1. 들어가며 스프링 시큐리티는 여러 가지 인증을 처리할 수 있도록 확장성 있게 개발되었다. 그 중 이번에는 기본적으로 제공되는 username과 password를 이용한 form 기반의 인증을 다룰 것이다. 2. SecurityContextPersistenceFilter 인증 처리가 시작되기 전에 거치게 되는 필터이다. 이 필터는 SecurityContext가 현재 요청에 포함되어 있는지 확인하고 없다면 만들어주는 역할을 수행한다. 그리고 이 SecurityContext는 하나의 요청의 흐름이 사용자에게 응답될 때까지 유지된다. 그 기반은 ThreadLocal로 동작한다. 실제로 인증을 처리하는 필터는 이후에 등장하는 UsernamePasswordAuthenticationFilter이다. 3. Auth..
2023.03.07