반응형

Programming 375

spring security + JWT 로그인 기능 파헤치기 - 1

로그인 기능은 거의 대부분의 애플리케이션에서 기본적으로 사용됩니다. 추가로 요즘은 웹이 아닌 모바일에서도 사용 가능하다는 장점과 Stateless 한 서버 구현을 위해 JWT를 사용하는 경우를 많이 볼 수 있는데요. 많이 사용되고, 또 주된 기능인만큼 꼭 한 번은 제대로 공부하고 싶어서 여러 자료를 참고하여 직접 구현하며 정리하는 내용입니다. (현재 코드는 Security + JWT + JPA 를 사용하여 구현되어 있고, 이후 최종적으로 Redis를 사용한 토큰 재발급 과정까지 추가할 예정입니다.) * 본 내용을 보기 전 참고하면 좋을 JWT, Spring Security 동작 원리, 구현된 코드 등은 포스팅 맨 아래 참고 자료로 링크를 첨부해놓았습니다. 도움이 되시길 바라며, 내용 중 잘못된 부분은 지..

UsernameNotFoundException Not Working 이유 파헤치기

Spring security, JWT 로그인 구현 중 UsernameNotFoundException 처리가 안 되는 현상이 발생하였습니다. 분명 해당 Exception 이 발생하지만 최종적으로는 BadCredentialsException 으로 처리되어 최종 response는 403 Forbidden 이 발생하였고, 디버깅을 통해 원인을 찾아봤습니다. @Service @RequiredArgsConstructor public class CustomUserDetailsService implements UserDetailsService { private final UsersRepository usersRepository; @Override public UserDetails loadUserByUsername(St..

io.jsonwebtoken.security.WeakKeyException : which is not secure enough for any JWT HMAC-SHA algorithm.

Security, JWT를 사용한 로그인 구현 중 발생한 에러입니다. 해당 에러는 메세지만 봐도 뭐가 문제인지 쉽게 파악할 수 있었는데요. [com.project.login.api.jwt.JwtTokenProvider]: Constructor threw exception; JwtTokenProvider를 Bean으로 등록하기 위해 객체를 만드는 중, 생성자에서 발생한 에러이고, 해당 내용은 HMAC-SHA algorithm을 사용하기 위해서는 256 bits 이상의 key 값이 필요한데 사용 중인 키는 176 bits로 충분하지 않다는 에러입니다. nested exception is io.jsonwebtoken.security.WeakKeyException: The specified key byte ar..

Programming/Error 2021.09.18

Java 객체 복사 Cloneable interface

Java 객체 복사 Cloneable interface 카드 결제 내역을 기록으로 테이블에 남기던 중, 찾아서 적용한 방식입니다. 이전에 성공 처리된 결제 내역에 대해서 취소 요청한 경우, 기존의 거래 기록 row는 그대로 두고, 다른 데이터는 같지만 state가 취소 요청인 새로운 row를 생성하여 저장해야 하는 상황에서 Cloneable interface를 적용하여 사용하였습니다. @Builder @Getter @Setter @NoArgsConstructor @Entity public class PaymentTransaction extends BaseEntity implements Cloneable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY)..

Programming/Java 2021.09.16

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near

MySQL, MariaDB KeyWords and Reserved Words Caused by: java.sql.SQLSyntaxErrorException: (conn=18727) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near (Error 중 일부) JPA, MariaDB를 사용하고 있는 프로젝트에서 아직 초기 단계라 따로 테이블을 생성하지 않고 JPA의 @Entity 어노테이션을 통해 자체적으로 테이블이 create 되도록 해놓고 작업을 하던 중 발생한 에러입니다. @Builder @Getter @NoArgs..

Programming/Error 2021.09.16

함수형 프로그래밍을 위한 Java Stream 기본 개념

Java Stream Java는 객체지향 언어이기 때문에 기본적으로 함수형 프로그래밍이 불가능합니다. 하지만 JDK 8부터 Stream API와 람다식, 함수형 인터페이스 등을 지원하면서 Java에서도 함수형 프로그래밍이 가능하게 되었습니다. JDK 8 이전에는 배열 또는 컬렉션 인스턴스를 다룰 때 for문 또는 for each 문을 돌면서 요소를 하나씩 꺼내서 다루는 방법을 사용했습니다. 간단한 경우는 상관이 없지만 로직이 복잡해질 경우 코드 양이 많아져서 여러 로직이 섞이게 되고, 메서드를 나눌 경우 루프를 여러 번 도는 경우가 발생합니다. Stream은 '데이터의 흐름' 입니다. Stream을 사용하면 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하여 가공된 결과를 얻을..

Programming/Java 2021.09.11

Spring Security 시큐리티 동작 원리 이해하기 - 2

Spring Security 시큐리티 동작 원리 이해하기 - 1 스프링 시큐리티 (Spring Security)는 스프링 기반 어플리케이션의 보안(인증과 권한, 인가)을 담당하는 스프링 하위 프레임워크입니다. 보안과 관련해서 체계적으로 많은 옵션들을 제공해주기 때문 wildeveloperetrain.tistory.com 첫 번째 포스팅에서 이어지는 내용입니다. 참고 부탁드리겠습니다. AuthenticationProvider 인터페이스를 구현하는 클래스 만들기 @RequiredArgsConstructor public class CustomAuthenticationProvider implements AuthenticationProvider { private final CustomUserDetailsServi..

Spring Security 시큐리티 동작 원리 이해하기 - 1

스프링 시큐리티 (Spring Security)는 스프링 기반 어플리케이션의 보안(인증과 권한, 인가)을 담당하는 스프링 하위 프레임워크입니다. 보안과 관련해서 체계적으로 많은 옵션들을 제공해주기 때문에 개발자의 입장에서는 하나하나 보안 관련 로직을 작성하지 않아도 된다는 장점이 있습니다. 알고 시작해야할 Spring Security 용어 및 기본 이론 인증 Authentication : 해당 사용자가 본인이 맞는지를 확인하는 절차 인가 Authorization : 인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차 접근 주체 Principal : 보호받는 Resource에 접근하는 대상 비밀번호 Credential : Resource에 접근하는 대상의 비밀번호 권한 : 인증된 주체가 어플리케이..

관습적인 추상화 Service, ServiceImpl 구조를 사용해야 할까?

Service interface와 ServiceImpl class 구조를 사용하는 이유? 대부분의 프로젝트는 Service를 만들 때 MemberService와 같이 서비스를 인터페이스로 설계하고, MemberServiceImpl 라는 구현체인 클래스를 생성해서 사용하는 방식으로 설계됩니다. 그동안 프로젝트를 하며 이유도 모른체 그냥 구조가 그런가 보다 하면서 계속 만들어서 사용하다가 이번에 그 이유에 대해 알고 싶어서 잘 정리된 몇몇 분들의 자료를 참고하여 정리하게 되었습니다. 내용 중 잘못된 부분은 댓글을 통해 말씀해주시면 찾아보고 수정하며 공부하겠습니다. 이론상으로 위와 같은 Service, ServiceImpl 패턴으로 설계를 해야하는 이유는 인터페이스와 구현체를 분리함으로써 구현체를 독립적으로 ..

IntelliJ 인텔리제이 properties 파일 한글 깨짐 설정 방법

IntelliJ properties 파일 한글 깨짐 설정 방법 기존에 작업된 프로젝트를 clone하여 작업하는 중 properties 파일의 한글이 깨지는 현상이 발생하였습니다. 이 부분은 IntelliJ 인코딩 설정 때문인데요. 한글이 깨지지 않도록 설정하는 방법입니다. Preferences 또는 Settings -> File Encodings 를 확인해보면 상단에 Global Encoding, Project Encoding 두 가지가 있고, 아래에 Properties Files (*.properties) 설정이 존재합니다. 해당 부분을 모두 UTF-8로 적용하고, 아래 Properties Files 부분은 Transparent native-to-ascii conversion 부분도 체크해줍니다. pr..

반응형