'분류 전체보기' 카테고리의 글 목록 (11 Page)
본문 바로가기

분류 전체보기

(243)
[Spring] Spring Security에서 지원하는 Logout과 JWT 기반 Logout 구현의 차이 스프링 공부를 위해 구입한 도서에서는 JWT 기반 회원가입, 로그인 기능은 있어도 로그아웃은 없길래 로그아웃 기능은 어떻게 구현할까 찾아보았다. 기능 추가를 하려면 새 DB를 써야해?? 구글링으로 스프링 JWT 기반 로그아웃 기능을 어떻게 구현했는지 찾아보았는데 Redis를 사용해서 로그인 시 Token 데이터를 저장하고, 로그아웃 시 Redis에서 토큰 데이터를 지우는 방식으로 구현하였다. 로그아웃 하려고 DB를 새로 추가하라니.. 그럼 로그인 기능도 바꿔주어야 하는 것 아닌가..란 생각이 들었다. 그래서 다른 방법을 찾기 위해 Spring Security에서 지원하는 Logout에 대해 알아보았다. Spring Security에서 기본으로 제공하는 Logout https://docs.spring.io..
[Database] isolation이 안될 때 나타날 수 있는 여러 현상 Isonlation이 안될 때 발생할 수 있는 이상한 현상들Dirty Readcommit 되지 않은 변화를 읽어서 이상한 값이 반영되는 상황을 Dirty Read 라고 한다.예시를 살펴보자.Transaction 1 Begins: A가 어떤 계좌에 $100 달러를 입금하려 한다. (Transaction 1) 현재 계좌 잔액은 $500 달러이다.Transaction 1 Modifies Data: Transaction 1은 새 잔액을 계산한다.($500 + $100 = $600) 하지만 commit은 하지 않는다.Dirty Read Occurs: 또 다른 transaction이 시작하여 계좌에 $500 달러를 read 한다. (Transaction 2)Transaction 2 Reads Uncom..
[개발 일기] Hibernate의 UUID 변환과 PostgreSQL, H2 DB에 저장할 때 동작 + Foreign Key Constraint 개요프로젝트 테스트 환경이 PostgreSQL의 서버를 필수적으로 켜져있어야 테스트가 가능했다.Springboot는 h2 db를 내장하고 있어 PostgreSQL의 의존성을 없애기 위해 새로운 테스트 환경을 만들고 있었다. 문제는 데이터 타입을 UUID로 사용하고 있는 필드에 대해서 아래와 같은 에러가 발생했다.Caused by: org.h2.message.DbException: Data conversion error converting "UUID requires 16 bytes, got 255" [22018-214] at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.jav..
[개발 일기] java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter String token = Jwts.builder() .setClaims(claims) .setIssuedAt(now) .setExpiration(new Date(now.getTime() + tokenValidMillisecond)) .signWith(SignatureAlgorithm.HS256, secretKey) // 암호화 알고리즘, secret 값 세팅 .compact(); 이 코드의 signWith() 에서 아래 에러가 발생했다. java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter 해결 방법 아래 의존성 추가하기 Maven은 javax.xml.bind jaxb-api 2.3.1 Gradle은 implementation 'java..
[Spring] Spring Security + JWT: UserDetails와 로그인, 회원가입 구현하기 UserDetails UserDetails는 Spring Security에서 사용자를 나타내는 인터페이스이다. 사용자 이름, 비밀번호, 권한 등 사용자 인증 및 권한 부여에 필요한 정보를 제공한다. Spring Security는 UserDetails 인터페이스를 구현한 클래스를 사용하여 사용자를 인증하고 권한을 부여한다. public interface UserDetails extends Serializable { Collection
[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..
[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..
[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..