반응형

Java Backend 개발자 되기 31

ContentCachingRequestWrapper 사용 예

Spring MVC 기반의 웹 애플리케이션을 개발하다보면 Interceptor나 AOP Advice 등에서 request body를 사용해야하는 경우가 종종 있을 수 있습니다. reqeust 전송 시, header에 추가되 전송되는 JWT의 claims에 포함된 memberId와 request body에 포함된 memberId가 동일한지를 검증하는 예를 들어보겠습니다. @Slf4j @Component @Aspect public class MemberVerifyAdvice extends VerifyAdvice { private final ObjectMapper objectMapper; public MemberVerifyAdvice(JwtTokenizer jwtTokenizer, ObjectMapper ob..

JWT를 이용한 인증(Authentication) 및 자격 검증(Authorization) 프로세스

Spring Security에서 JWT를 발급 받는 방법은 크게 두 가지로 볼 수 있습니다. 첫째는 구글 검색을 통해서도 흔히 볼 수 있는 Controller를 이용해서 아이디/패스워드 로그인 후, JWT를 발급 받는 방식이고, 두 번째는 Spring Security에서 지원하는 Security Filter를 확장하는 방법입니다. Controller를 이용하는 것이 안좋은 방법이라고 보기는 힘들지만 그래도 Spring Security라는 보안 프레임워크를 사용하는 개발자 입장에서는 Controller까지 request가 전달되기 전에 Security Filter 레벨에서 인증을 처리하는 것이 조금 더 자연스럽지 않을까하는 생각을 해보게 됩니다. 이번 글에는 구체적인 코드는 없지만 JWT를 이용해 어떤식으..

JWT 자격 검증 시, SecurityContext는 언제 비워(clear)질까?

클라이언트 쪽에서 전송한 username과 password에 대한 인증을 처리하는 JwtAuthenticationFilter(UsernamePassworAuthenticationFilter를 확장)에서 로그인 인증에 성공한 뒤, JWT를 클라이언트 쪽에 응답으로 전달했다고 가정해 봅시다. 이제 클라이언트는 백엔드 애플리케이션의 API 엔드포인트를 이용할 때 마다 백엔드 애플리케이션으로부터 전달 받은 JWT를 header에 포함시켜 request를 전송합니다. 만약 JWT를 검증하는 필터인 JwtVerificationFilter가 구현되어 있는 상태라면 백엔드 애플리케이션에서는 이 JwtVerificationFilter를 이용해 클라이언트의 request header 등에 포함된 JWT를 검증하는 처리를 ..

Spring Security에서의 권한 부여 (Authorization) 처리 흐름

Spring Security Filter Chain에서 URL을 통해 사용자의 액세스를 제한하는 권한 부여 Filter는 바로 AuthorizationFilter 이다. SecurityContextHolder로 부터 Authentication을 획득 SecurityContextHolder로 부터 획득한Authentication과 HttpServletRequest를 AuthorizationManager에게 전달 AuthorizationManager는 권한 부여 처리를 총괄하는 매니저 역할을 한다. RequestMatcherDelegatingAuthorizationManager는 AuthorizationManager를 구현하는 구현체 중 하나이다. RequestMatcherDelegatingAuthoriza..

Spring Security에서의 인증(Authentication) 처리 흐름

UsernamePasswordAuthenticationFilter 는 Username/Password 기반의 인증 요청을 처리한다. UsernamePasswordAuthenticationToken 생성 아직 인증되지 않은 Authentication 객체 AuthenticationManager는 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스. ProviderManager는 AuthenticationManager를 구현한 구현 클래스 UserDetails는 사용자의 자격을 증명해주는 크리덴셜(Credentials) 과 권한 정보를 가지고 있는 객체. UserDetailsService가 사용자의 Credential과 권한 정보를 조회해서 UserDetails 를 생성. UserDetailsService가..

그림과 코드로 알아보는 Spring MVC 요청 처리 흐름

우리가 흔히 알고 있는 Spring MVC의 요청 처리 흐름 한 가운데에는 DispatcherServlet이 자리잡고 있습니다. 클라이언트로부터 들어오는 HTTP request는 Servlet Filter를 거쳐 DispatcherServlet에 전달되고, DispatcherServlet은 해당 request를 처리할 Controller를 검색하고 대상 Controller에게 request를 전달하기 위해 HandlerMapping과 HandlerAdapter 등의 컴포넌트를 이용합니다. 대부분 다 알고 있는 내용이기 때문에 자세한 설명은 필요없을 것 같습니다. 다만, 구글링을 통해 그림으로 표현한 Spring MVC의 요청 처리 흐름에 대한 자료는 많이 볼 수 있지만 코드 베이스의 자료는 생각보다 찾기..

메시지 암호화에 대한 짧은 이야기

우리가 일반적으로 생각하는 대표적인 암호화의 대상은 크리덴셜(Credential)의 한 종류인 패스워드입니다. 패스워드는 암호화의 대상인 메시지를 조금 더 구체적으로 표현한 것이라고 볼 수 있을테구요. 이번 시간에는 암호화에 대한 아주 쉬운 이야기를 짧게 해보려고 합니다. 암호화란 무엇인지 암호화 유형에는 기본적으로 어떤것이 있는지 등을 아주 쉽게 이해할 수 있도록 짧게 정리해 보겠습니다. 암호화란? 사용자의 민감한 정보를 보호하기 위한 기술 Crypto 또는 Cipher라는 비슷한 용어가 있음 Ciphertext: 암호화 된 텍스트 Cryptography 암호학적 관점에서의 암호화 전체를 아우르는 말 Crypto Currency 암호 화폐 Encryption / Decryption 암호학 관점에서의 데..

Spring WebFlux + R2DBC 환경에서 H2 web console 사용하기

※ 이 글은 아끼는 저의 학생이 공유한 글을 기반으로 재편집한 글입니다. 기존의 Spring MVC 환경에서는 인메모리 DB인 h2의 web console을 이용하기 수월했었는데, Spring WebFlux + R2DBC 환경에서는 Spring MVC 환경에서 사용하던 방법 그대로 h2의 web console을 이용할 수 없기 때문에 별도의 설정을 해주어야 합니다. Spring WebFlux + R2DBC 환경에서 h2 web console을 사용하기 위한 설정 방법은 다음과 같습니다. Gradle 설정 == build.gradle == dependencies { ... implementation 'io.r2dbc:r2dbc-h2' } build.gradle의 dependencies에 implementa..

No default constructor for entity 에러

Spring Data JPA에서 findById() 같은 API를 사용해 데이터를 조회할 때, No default constructor for entity 라는 에러가 발생하는 이유가 무엇인지 조금 더 디테일하게 분석해보았습니다. Spring Data JPA에서는 개발자가 JpaRepository 등의 인터페이스를 상속하는 Repository 인터페이스를 구현하는 구현 클래스의 인스턴스를 생성하기 위해 내부적으로 Dynamic Proxy라는 기술과 Reflection을 이용하는데 RepositoryFactorySupport에서 해당 인스턴스(Repository의 Proxy)를 생성합니다. 그런데, 여기까지는 Spring에서 지원하는 Repository 인터페이스(개발자가 JpaRepository 같은 인..

반응형