메인

[인증/인가] JWT토큰 생성 과정과 원리에 대해서

목차 클라이언트 로그인 서버 인증 JWT 토큰 생성 토큰 암호화 토큰 검증 토큰 전달 클라이언트 요청 JWT토큰이란?? JWT(JSON WEB TOKEN)은 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의하는 개방형 표준(RFC 7519)입니다. 이 정보는 디지털 서명되어 있으므로 확인하고 신뢰할 수 있습니다. JWT는 HS(HMAC 알고리즘 포함) 또는 RSA 또는 ECDSA를 사용하는 공개/개인 키 쌍을 사용하여 서명할 수 있습니다. 사실 이렇게 개념을 들어도 이게 어떻게 만들어지고 어떻게 사용되는지 잘 체감이 안됐습니다. 그래서 그 과정에 대해서 어떻게 만들어지고 어떤방식으로 진행되는지 알아봤습니다. 토큰에 대해서 간략하게 말하자면 서버에게 내가 나임을 증명..

인증|인가 2023.07.05 0

[Java] Relection 메소드 필드명 가져오기 arg0, arg1

메소드 필드명이 필요했던 이유AOP를 이용해 다양한 곳에서 유연하고 범용성 있게 사용하기 위해 메소드의 매개변수 필드명이 필요했습니다.Reflection 메소드 매개변수 필드명 가져오기해당 log에서 원하는 출력 값은 lockName과 userId의 값이였습니다.Parameter.getName()하지만 예상했던 것과는 다르게 arg0, arg1 과 같은 변수명을 가져왔습니다.그래서 저는 왜 이런 값을 가져오는지 내부 메소드를 확인해봤습니다클래스 구조도Method클래스는 Executable 클래스를 상속하고 있고 getParameters는 Executable클래스에서 구현되어 있었습니다ExecutablegetParameters 메소드(시작)privateGetParameters 메소드tmp가 초기화 되는 로..

JAVA 2024.04.28 0

[Python] 프로그래머스 길 찾기 게임 Tree 자료형으로 풀기

길찾기 게임 문제 설명 x, y 좌표로 이루어진 이진트리의 맵에서 전위 순회, 후위 순회 방식으로 순회한 노드의 번호들을 반환하는 문제입니다. 문제 해결방법 저는 이 문제를 해결하기 위해서 트리 자료구조를 만들어서 문제를 해결해보고자 했습니다. 트리 자료구조 만들기 class Node: def __init__(self, x, y, value=None, left=None, right=None, parent=None): self.x = x self.y = y self.value = value self.left = left self.right = right self.parent = parent우선 필드를 보면 x와 y좌표 자식 노드를 저장할 left, right와 부모노드를 가르키는 parent 필드로 구성하..

코딩테스트 2023.05.13 1

[알고리즘] 이진트리의 전위순회, 중위순회, 후위순회 알아보기

오늘은 이진트리 순회 하는 방법에 대해서 공부해 보려고 합니다. 이진트리란? 이진 트리는 루트(Root) 노드에서 시작하여 각 노드는 왼쪽 서브트리(Left Subtree)와 오른쪽 서브트리(Right Subtree)로 이루어져 있습니다. 각 노드의 자식 노드는 최대 두 개이기 때문에, 이진 트리는 가장 단순한 형태의 트리 중 하나입니다. 이진트리의 활용분야 데이터베이스: 이진 트리는 데이터베이스에서 색인(Index)을 만드는데 사용됩니다. 이진 트리를 사용하면 검색 속도가 빨라지기 때문에, 대규모 데이터베이스에서 빠른 검색을 구현할 수 있습니다. 정렬 알고리즘: 이진 트리는 정렬 알고리즘에서 사용됩니다. 예를 들어, 이진 탐색 트리(Binary Search Tree)는 데이터를 효과적으로 정렬하고 검색..

알고리즘 2023.05.11 0

[SpringBoot] In-Memory 환경 Memory Leak

InMemory 인증번호 관리회원가입을 할 때 핸드폰 번호로 인증번호를 전송하고 인증번호를 통해 회원을 검증했습니다.인증번호 발행랜덤 번호를 생성하고 휴대폰으로 랜덤번호를 전송하고 Map 번호를 저장하는 방식입니다.인증번호 검증현재 인증시간이 유효한지 확인하고 인증번호를 검증합니다. 인증번호가 일치하면 Map에서 key를 제거하지만 인증번호가 일치하지 않는다면 계속해서 메모리에 남아있게 됩니다.인메모리로 관리하는 key관리시 메모리 Leak 발생key를 요청하고 검증을 하지 않았을 때 계속해서 데이터가 Map에 참조하고 있어 GC가 메모리를 수거하지 않습니다.해결방법@TimeTrace @Scheduled(cron = "0 10 * * * *") public void clearAuthentica..

SpringBoot 2024.06.20 0

BeanPay Detail 삭제 이유

변경 전 테이블 구조BeanPayDetail 역할BeanPayDetail의 역할은 기존의 빈페이의 변경 내역에 관한 정보를 담고 있었습니다.총 4가지의 역할을 갖고 상태값을 통해 나누어서 사용했습니다.충전지출입금출금PaymentDetail 역할PaymentDetail 역할은 세부 결제 내역 정보를 담고 있으며 PaymentStatus로 상태값을 나누어 관리합니다.결제환불중복된 컬럼변경 이유PaymentDetail과 BeanPayDetail의 진행 상태인 ProcessStatus 값이 중복되어 사용됐습니다.BeanPayDetail의 추가적인 Row를 생산하지 않을 수 있습니다.로직이 하나의 Depth가 줄어들고 유지보수성이 높아졌습니다.기존의 복잡했던 연관관계가 줄어들었습니다 BeanPayDetail은 B..

SpringBoot 2024.06.03 0

주문/결제, 동기/비동기 처리에 대한 고민

주문/결제, 동기/비동기 처리에 대한 고민저희는 충전 API와 결제 API가 분리되어 있어 주문 -> 결제 로직이 실행될 때는 토스 외부 API에 영향을 받지 않습니다. 그렇기 때문에 주문이 발생함과 동시에 결제도 같이 처리될 수 있었습니다.그래서 저희는 3가지 방식을 생각했습니다.첫번째 주문 API에서 모든 로직을 동기로 처리하는 것 입니다. (동기)두번째 는 주문 API와 결제 API를 분리하는 것 입니다. (동기)세번째 는 주문 API에서 결제 API까지 처리하는 것 입니다. (부분 비동기) 첫번째는 주문 API에서 모든 로직을 동기로 처리하는 것 입니다. (동기)시퀸스 다이어그램을 보시면 Order MSA에서 모든 로직이 수행되며 다른 MSA를 호출하여 로직이 수행됩니다.한번에 모든 MSA에게 요..

SpringBoot 2024.06.02 0

락 선택 이유와 성능 테스트

테스트 종류1. 락 X 트랜잭션 사용2. Beta Lock 사용3. Redisson 분산락 사용총 3가지의 테스트를 했습니다. 각각의 코드에서 발생할 수 있는 문제점, 걸린 시간, 특징에 대해서 작성했습니다.테스트 환경DB: H2Mode: MariaDB테스트 환경: LocalReids: Embedded요청 스레드 수 : 32요청 횟수 : 각 1회Transaction을 사용하여 동시성 테스트 결과코드 본문@Transactional public void notUseLockTest(String lockName, Integer userId) { BeanPay beanPay = getBeanPay(1, Role.USER); final BeanPayDetail beanPayDetail = Bea..

SpringBoot 2024.04.30 0

코리아노 BeanPay 고민

빈페이로 결제하게 된 이유서비스내의 결제 로직과 외부 API를 통한 충전로직을 분리함으로 써 외부 API에서 발생했을때 문제와 결제 기능과 분리할 수 있기 때문입니다! 또한 결제를 진행하는 중에는 외부API를 연동하지 않기 때문에 사용자의 경험을 향상시키고 결제 프로세스를 간소화할 수 있습니다.서비스 자체 포인트인 빈페이를 관리하는 방법유저 MSA에 beanpay 컬럼을 두어 결제 MSA API 요청을 통해 관리한다.결제 MSA에 BeanPay 테이블과 BeanPay 상세 테이블을 두어 관리한다.1. 유저 MSA에 beanpay 컬럼을 두어 결제 MSA API 요청을 통해 관리한다.결제 MSA에서 출금, 결제, 환불, 사용 과 같은 행위를 할 때 유저 MSA에게 요청을 하고 로직을 수행합니다. 하지만 이..

SpringBoot 2024.04.17 0

[자료구조] 실전 알고리즘 Ox15강 해시 (Java)

해시 자료구조는 16자리의 번호의 일부분을 index로 사용하는 자료구조입니다. 해시함수란 임의 길이의 데이터를 고정된 길이의 데이터로 대응시키는 함수 16자리 Hash값을 가진 테이블 모든 해시를 배열로 가지고 있으면 10^16의 배열이 필요합니다. 이는 40페타 바이트를 차지하게 됩니다. 그렇기에 모든 hash값을 사용하는게 아닌 일부분만의 값을 사용하여 해시테이블을 생성합니다. 이 때 해시 테이블은 배열 자료구조로 생성됩니다. 끝 4자리만 사용한 해시테이블 hash값의 일부분만을 사용하여 hash테이블이 구현됩니다. 충돌 회피 1 Chaining Key가 중복된 노드를 LinkedList로 연결하여 관리합니다. 자바의 STL의 자료구조는 Chaining방식을 가져가고 있습니다. 주의사항 만약 충돌이..

자료구조 2024.02.05 0

[Java] 동적 프록시에 대해

프록시는 기존 코드에 영향을 주지 않으면서 타깃의 기능을 확장하거나 접근 방법을 제어할 수 있는 유용한 방법입니다. 하지만 데코레이터 패턴을 활용해서 부가적인 기능을 하는 코드를 클래스마다 매번 정의해야하고 클래스도 매번 넣어야 했습니다. 여기서 오는 코드의 중복과 다수의 클래스가 생겨났습니다. 이러한 문제점들을 해결해주는게 바로 동적 프록시입니다. 자바에서는 동적프록시를 어떻게 사용하는지 알아보겠습니다. 자바에서 동적프록시를 사용하기 위한 클래스 Proxy InvocationHandler 서비스로직 인터페이스 서비스로직 구현체 부가기능 구현체(InvocationHandler를 구현한) 위 그림에서 보면 Proxy클래스를 기반으로 동적 프록시가 생성되고 필드에 클래스 로더와 서비스로직 인터페이스 부가기능..

JAVA 2023.11.28 0

[Spring Boot] @WithMockUser 테스트 시 getPrincipal Null

오늘의 문제점 테스트 코드를 작성할 때 Security에서 제공하는 @WithMockUser 어노테이션을 사용해서 인증 테스트를 수행했습니다. 하지만 Authentication의 getPrincipal() 메소드를 사용할 때 null이 반환되는 현상이 발생해서 테스트를 통과 하지 못했습니다. 기존의 방식 @GetMapping("/mycomments") public Response getMyComments(Authentication authentication, Pageable pageable) { String username = authentication.getName() Page response = postService.getMyComments(username, pageable).map(CommentRe..

SpringBoot 2023.05.02 0

[SpringBoot] Transaction 커밋 적용

오늘의 문제: Transaction 내 코드 분석 Transaction 오늘 코딩하면서 게시글을 수정하는 단계에서 updated_at 수정 필드가 업데이트가 되지 않아서 찾아보게 됐다. @Transactional public Post modify(String title, String body, String username, Integer postId) { // 포스트 찾기 log.info("포스트 찾기"); PostEntity postEntity = postRepository.findById(postId).orElseThrow(() -> new SnsException(Errorcode.NOT_EXISTS_POST, String.format("게시글 ID: %d", postId))); // 생성자, 수정자..

SpringBoot 2023.04.20 0

최신글

more

[SpringBoot] ThreadLocal을 활용한 인증관리

스프링부트는 ThreadPool을 통해 스레드를 미리 생성하고 요청에 맞게 쓰레드를 배정하고 응답이 끝나면 쓰레드를 반환합니다.저는 이 쓰레드를 이용해 인증을 통과한 사용자일 때 ThreadLocal에 사용자의 ID를 삽입하여 전역적으로 사용할 수 있게 하려고 했습니다.문제점 발생!!하지만 처음에 인증에 성공하여 ThreadLocal에 저장되고 초기화 하지 않았을 때 다음 사용자가 인증에 실패해도 전에 사용자의 정보가 남아있어 비즈니스 로직이 실행되는 문제가 발생했습니다.아래 예시들을 통해 설명드리겠습니다.1번 요청의 사용자는 1이라는 값을 통해 인증을 수행합니다.인증 로직을 통과하고 전역적으로 사용할 수 있는 쓰레드에 1이라는 값을 저장합니다.1번 사용자가 요청한 비즈니스 로직을 끝맡히고 쓰레드풀에 쓰..

SpringBoot 2024.06.20 0

[SpringBoot] In-Memory 환경 Memory Leak

InMemory 인증번호 관리회원가입을 할 때 핸드폰 번호로 인증번호를 전송하고 인증번호를 통해 회원을 검증했습니다.인증번호 발행랜덤 번호를 생성하고 휴대폰으로 랜덤번호를 전송하고 Map 번호를 저장하는 방식입니다.인증번호 검증현재 인증시간이 유효한지 확인하고 인증번호를 검증합니다. 인증번호가 일치하면 Map에서 key를 제거하지만 인증번호가 일치하지 않는다면 계속해서 메모리에 남아있게 됩니다.인메모리로 관리하는 key관리시 메모리 Leak 발생key를 요청하고 검증을 하지 않았을 때 계속해서 데이터가 Map에 참조하고 있어 GC가 메모리를 수거하지 않습니다.해결방법@TimeTrace @Scheduled(cron = "0 10 * * * *") public void clearAuthentica..

SpringBoot 2024.06.20 0

BeanPay Detail 삭제 이유

변경 전 테이블 구조BeanPayDetail 역할BeanPayDetail의 역할은 기존의 빈페이의 변경 내역에 관한 정보를 담고 있었습니다.총 4가지의 역할을 갖고 상태값을 통해 나누어서 사용했습니다.충전지출입금출금PaymentDetail 역할PaymentDetail 역할은 세부 결제 내역 정보를 담고 있으며 PaymentStatus로 상태값을 나누어 관리합니다.결제환불중복된 컬럼변경 이유PaymentDetail과 BeanPayDetail의 진행 상태인 ProcessStatus 값이 중복되어 사용됐습니다.BeanPayDetail의 추가적인 Row를 생산하지 않을 수 있습니다.로직이 하나의 Depth가 줄어들고 유지보수성이 높아졌습니다.기존의 복잡했던 연관관계가 줄어들었습니다 BeanPayDetail은 B..

SpringBoot 2024.06.03 0

주문/결제, 동기/비동기 처리에 대한 고민

주문/결제, 동기/비동기 처리에 대한 고민저희는 충전 API와 결제 API가 분리되어 있어 주문 -> 결제 로직이 실행될 때는 토스 외부 API에 영향을 받지 않습니다. 그렇기 때문에 주문이 발생함과 동시에 결제도 같이 처리될 수 있었습니다.그래서 저희는 3가지 방식을 생각했습니다.첫번째 주문 API에서 모든 로직을 동기로 처리하는 것 입니다. (동기)두번째 는 주문 API와 결제 API를 분리하는 것 입니다. (동기)세번째 는 주문 API에서 결제 API까지 처리하는 것 입니다. (부분 비동기) 첫번째는 주문 API에서 모든 로직을 동기로 처리하는 것 입니다. (동기)시퀸스 다이어그램을 보시면 Order MSA에서 모든 로직이 수행되며 다른 MSA를 호출하여 로직이 수행됩니다.한번에 모든 MSA에게 요..

SpringBoot 2024.06.02 0

락 선택 이유와 성능 테스트

테스트 종류1. 락 X 트랜잭션 사용2. Beta Lock 사용3. Redisson 분산락 사용총 3가지의 테스트를 했습니다. 각각의 코드에서 발생할 수 있는 문제점, 걸린 시간, 특징에 대해서 작성했습니다.테스트 환경DB: H2Mode: MariaDB테스트 환경: LocalReids: Embedded요청 스레드 수 : 32요청 횟수 : 각 1회Transaction을 사용하여 동시성 테스트 결과코드 본문@Transactional public void notUseLockTest(String lockName, Integer userId) { BeanPay beanPay = getBeanPay(1, Role.USER); final BeanPayDetail beanPayDetail = Bea..

SpringBoot 2024.04.30 0