Development/Spring 47

[Spring] Spring Security에서 지원하는 Logout과 JWT 기반 Logout 구현의 차이

스프링 공부를 위해 구입한 도서에서는 JWT 기반 회원가입, 로그인 기능은 있어도 로그아웃은 없길래 로그아웃 기능은 어떻게 구현할까 찾아보았다. 기능 추가를 하려면 새 DB를 써야해?? 구글링으로 스프링 JWT 기반 로그아웃 기능을 어떻게 구현했는지 찾아보았는데 Redis를 사용해서 로그인 시 Token 데이터를 저장하고, 로그아웃 시 Redis에서 토큰 데이터를 지우는 방식으로 구현하였다. 로그아웃 하려고 DB를 새로 추가하라니.. 그럼 로그인 기능도 바꿔주어야 하는 것 아닌가..란 생각이 들었다. 그래서 다른 방법을 찾기 위해 Spring Security에서 지원하는 Logout에 대해 알아보았다. Spring Security에서 기본으로 제공하는 Logout https://docs.spring.io..

Development/Spring 2024.04.21

[Spring] Spring Security + JWT: UserDetails와 로그인, 회원가입 구현하기

UserDetails UserDetails는 Spring Security에서 사용자를 나타내는 인터페이스이다. 사용자 이름, 비밀번호, 권한 등 사용자 인증 및 권한 부여에 필요한 정보를 제공한다. Spring Security는 UserDetails 인터페이스를 구현한 클래스를 사용하여 사용자를 인증하고 권한을 부여한다. public interface UserDetails extends Serializable { Collection

Development/Spring 2024.04.15

[Spring] Spring Security + JWT: SecurityFilterChain, AccessDeniedHandler, AuthenticationEntryPoint

SecurityFilterChain Spring Security(버전 5.7 이상)에서 SecurityFilterChain은 웹 애플리케이션을 보호하는 Filter Chain을 나타내는 Bean이다. 이 Filter들은 인증, 권한 부여, 세션 관리 등 다양한 보안 작업을 처리한다. WebSecurityConfigurationAdapter? WebSecurityConfigurerAdapter은 Spring Security 5.7 이후로 더이상 사용되지 않는다.(deprecated) 대신, SecurityFilterChain 이라는 Bean을 등록하여 구현하는 방식이 사용된다. SecurityFilterChain의 작동 방식 Spring Security는 애플리케이션 시작 시 SecurityFilterCh..

Development/Spring 2024.04.07

[Spring] Spring Security + JWT: JwtAuthenticationFilter

JwtAuthenticationFilter JwtAuthenticationFilter는 JWT 토큰으로 인증하고 SecurityContextHolder에 추가하는 필터를 설정하는 클래스이다. 스프링 부트에서는 Filter를 여러 방법으로 구현할 수 있는데, 가장 편한 구현 방법은 Filter를 상속받아 사용하는 것이다. 대표적으로 GenericFilterBean과 OncePerRequestFilter 두 가지 상속 객체를 사용한다. GenericFilterBean을 사용한 구현 public class JwtAuthenticationFilter extends GenericFilterBean { private final JwtTokenProvider jwtTokenProvider; public JwtAuth..

Development/Spring 2024.04.06

[Spring] Spring Security + JWT: JwtTokenProvider

JwtTokenProvider 구현 JWT 기반 보안 시스템을 구현하기 위해 JWT 토큰을 생성하는 메서드가 필요하다. 이를 위해 JwtTokenProvider라는 JWT 토큰을 생성하는 메서드를 단계 별로 구현하겠다. 1. secretKey 생성 @Component @RequiredArgsConstructor public class JwtTokenProvider { private final Logger LOGGER = LoggerFactory.getLogger(JwtTokenProvider.class); private String secretKey = "secretKey"; private final long tokenValidMillisecond = 1000L * 60 * 60; // Valid 1 h..

Development/Spring 2024.04.06

[Spring] JWT와 Spring Security

JWT(JSON Web Token) JWT는 서로 통신을 하면서 정보를 JSON 형태로 안전하게 전송하기 위한 토큰이다. JWT는 URL로 이용할 수 있는 문자열로만 구성돼 있으며, 디지털 서명이 적용돼 있어 신뢰할 수 있다. JWT는 주로 서버와의 통신에서 권한 인가를 위해 사용된다. URL에서 사용할 수 있는 문자열로만 구성돼 있어 HTTP 구성요소 어디든 위치할 수 있다. JWT의 구조 JWT는 '.' 으로 구분된 세 부분으로 구성된다. 헤더(Header) 내용(Payload) 서명(Signature) 헤더 JWT의 헤더는 검증과 관련된 내용을 포함한다. 헤더에는 alg, typ 속성 두 가지 정보를 포함한다. { "alg": "HS256", // 'HMAC SHA256' "typ": "JWT" }..

Development/Spring 2024.03.27

[Spring] 인증과 권한 부여, Spring Security

보안 용어 이해 인증(authentication) 인증은 사용자가 누구인지 확인하는 단계이다. 예를 들어, 로그인은 데이터베이스에 등록된 아이디와 패스워드를 사용자가 입력한 아이디와 패스워드와 비교하여 일치 여부를 확인하는 인증 과정이다. 토큰 인증 방식에서 로그인에 성공하면 애플리케이션 서버는 응답으로 사용자에게 토큰(Token)을 전달한다. 로그인에 실패한 사용자는 토큰을 전달받지 못해 원하는 리소스에 접근할 수 없게 된다. 세션 방식 로그인 방식에서 서버는 일반적으로 토큰 대신 세션 ID를 사용자에게 전달한다. 인가(Authorization) 인가는 인증을 통해 검증된 사용자가 애플리케이션 내부의 리소스에 접근할 때 사용자가 해당 리소스에 접근할 권리가 있는지를 확인하는 과정을 의미한다. 예를 들어..

Development/Spring 2024.03.22

[Spring] 서버 간 통신하기: WebClient

WebClient일반적으로 실제 운영환경에 적용되는 애플리케이션은 정식 버전으로 출시된 스프링 부트의 버전보다 낮은 경우가 많기 때문에 RestTemplate을 많이 사용하고있다. 하지만 최신 버전에서는 RestTemplate이 지원 중단되어 WebClient를 사용할 것을 권고하고 있다.Spring WebFlux는 HTTP 요청을 수행하는 클라이언트로 WebClient를 제공한다.WebClient는 리액터(Reactor) 기반으로 동작하는 API이다. 리액터 기반이므로 스레드와 동시성 문제를 벗어나 비동기 형식으로 사용할 수 있다.WebClient 특징논블로킹(Non-Blocking) I/O를 지원리액티브 스트림(Reactive Streams)의 백 프레셔(Back Pressure)를 지원적은 하드웨어..

Development/Spring 2024.03.20

[Spring] 서버 간 통신하기: RestTemplate

스프링에서 다른 서버로 웹 요청 보내기: RestTemplate과 WebClient 최근에 개발되는 서비스들은 마이크로서비스 아키텍처(MSA) 를 주로 채택하고 있습니다. MSA는 말 그대로 애플리케이션이 가지고 있는 기능(서비스)이 하나의 비즈니스 범위만 가지는 형태입니다. 각 애플리케이션은 자신이 가진 기능을 API로 외부에 노출하고, 다른 서버가 그러한 API를 호출해서 사용할 수 있게 구성되므로 각 서버가 다른 서버의 클라이언트가 되는 경우도 많습니다. 스프링에서는 다른 서버로 웹 요청을 보내고 응답을 받을 수 있게 도와주는 RestTemplate 와 WebClient가 있습니다. 이 글에선 RestTemplate에 대해 살펴보겠습니다. RestTemplate RestTemplate은 스프링에서 ..

Development/Spring 2024.03.19

[Spring] 스프링 액추에이터(Actuator)

스프링 부트 액추에이터 스프링 부트 액추에이터는 HTTP 엔드포인트나 JMX(Java Management Extensions)를 활용해 애플리케이션을 모니터링하고 관리할 수 있는 기능을 제공한다. JMX(Java Management Extensions)는 실행 중인 애플리케이션의 상태를 모니터링하고 설정을 변경할 수 있게 해주는 API 액추에이터를 사용하려면 다음과 같이 spring-boot-starter-actuator의존성을 추가해야 한다. Maven org.springframework.boot spring-boot-starter-actuator Gradle dependencies { implementation 'org.springframework.boot:spring-boot-starter-actu..

Development/Spring 2024.03.10