SpringBoot 20

Spring boot 에서 RSA JWT 적용해보기 (2) | 구현

전체 구현은 아래 GitHub 저장소에서 확인하실 수 있습니다.🔗 GHGHGHKO/roadmap-todo 이 글에서는 JWT를 발급하고 검증하는 서버에서 토큰을 핸들링하는 핵심 로직만 발췌하여 설명합니다.Kotlin과 Spring Boot 3.4.0-SNAPSHOT, Corretto 21을 사용했습니다.https://github.com/GHGHGHKO/roadmap-todo GitHub - GHGHGHKO/roadmap-todo: todos with authenticatetodos with authenticate. Contribute to GHGHGHKO/roadmap-todo development by creating an account on GitHub.github.com 기능 개요이 서버는 R..

SpringBoot 2025.06.23

Spring boot 에서 RSA JWT 적용해보기 (1) | 개요 및 검증

RSA JWT 적용하는 이유모바일 앱으로부터 전달받은 JWT의 payload를 서버에서 사용해야 하는 상황이 발생했습니다.이때 JWT는 HMAC 기반(HS256, HS384, HS512)으로 서명되어 있었고, 이를 검증하거나 payload를 신뢰하려면 secret key(대칭키)가 필요했습니다.그러나 이 키는 외부에 노출되면 안 되기 때문에, 보안상 앱에서 전달받을 수 없는 구조였습니다.결국 서버는 JWT를 검증하기 위해 JWT를 발급한 인증 서버에 검증 요청을 해야만 했습니다. HMAC JWT 방식의 한계이 구조도 가능하긴 하지만, 다음과 같은 단점이 있습니다:JWT Issuer는 토큰을 발급할 뿐 아니라 검증 요청도 매번 처리해야 합니다.따라서 JWT Issuer의 부하가 증가할 수 있으며, 서비스 ..

SpringBoot 2025.06.21

Springboot 속도 제한 및 조절 구현, 유량 제어 | Resilience4j

1. 적용 사유2. Resilience4j가 뭔가요3. 적용 방법4. 결과 1. 적용 사유https://roadmap.sh/projects/weather-api-wrapper-service Weather API Project IdeaBuild a weather API that fetches and returns weather data from a 3rd party API.roadmap.sh요 과제를 수행하다 Rate Limit을 조절해달라는 요구사항이 있어서 사용했습니다.특정 API 의 요청이 일정 수치 이상 되면 오류 Response body를 반환합니다. 2. Resilience4j가 뭔가요Resilience4j는 Circuit Breaker, Rate Limiter, Retry, Bulkhead을 ..

SpringBoot 2025.03.17

Springboot ECS logging structure

1. 적용 사유2. Marker가 뭔가요3. ECS 로깅이 뭔가요4. 적용 방법5. 결과  1. 적용 사유datadog에 로그를 쌓기 위해 ecs 포맷을 사용해야 했습니다.그 중 개인정보가 포함되어있는 로그 정보를 datadog에 보낼 수 없었습니다.그래서 slf4j 혹은 log4j 로그에 Marker를 추가하여개인정보 로그는 보내지 않도록 설정하기로 하였습니다. 2. Marker가 뭔가요로그에 Object를 추가하여 태그를 지정할 수 있습니다.예를 들어 특정 Marker가 있는 로그는 출력하지 않기. 3. ECS 로깅이 뭔가요ECS는 로그 및 메트릭과 같은 Elasticsearch 혹은 datadog 에 이벤트 데이터를 저장할 때 사용할 공통 필드 집합입니다. 이벤트 소스 : 이벤트 소스가 Elasti..

SpringBoot 2025.02.26

Spring Boot XSS 크로스사이트 스크립트 적용하기 with jsoup

1. 서론2. 적용 방법3. 결과적용했던 코드https://github.com/GHGHGHKO/roadmap-todo/commit/2b7f2543df849704f9784d3afc818ae07db72ef81. 서론회사에서 최근에 시작한 프로젝트에 보안 검사를 받았습니다.Request body를 통한 크로스사이트 스크립트 취약점이 도출 되었습니다. 도출되었던 방식은1. a_dns API Request body에 악성 script를 심어서 전송합니다.2. database에는 악성 script가 입력됩니다.3. 일반 고객이 b_dns 로 홈페이지에 접속합니다.4. 악성 script가 들어가 있는 정보를 조회합니다.5. 악성 script가 db에서 조회되어 고객에게 보여집니다.6. 해당 스크립트가 웹사이트에서 실..

SpringBoot 2024.12.01

GraalVM 으로 SpringBoot 시작 시간 줄이기 (맛보기)

TL;DRGraalVM(지랄VM)은 Java 어플리케이션을 미리 컴파일하여 바로 시작될 수 있게 합니다. 시작 시 워밍업이 필요하지 않으며, 더 적은 리소스를 사용합니다. 대신 빌드가 느립니다. 자세한 정보는 https://www.graalvm.org/latest/docs/getting-started/ 시작시간 비교하기Spring Batch를 사용하였습니다. (아주 간단한 Job을 실행하였습니다.) 2.474s -> 0.114s 예시 코드 https://github.com/GHGHGHKO/migration-v3-with-graal migration-v3-with-graal/src/main at main · GHGHGHKO/migration-v3-with-graalMigrating from Spring B..

SpringBoot 2024.03.27

RequestParam(required = true) null exception 하는 법

전체 코드 https://github.com/GHGHGHKO/goose-auth-api-server GitHub - GHGHGHKO/goose-auth-api-server Contribute to GHGHGHKO/goose-auth-api-server development by creating an account on GitHub. github.com @Operation(summary = "GooseAuth delete item uris", description = "id로 접속 정보의 uri들을 삭제한다.") @DeleteMapping(value = "/items/{itemIdentity}") public ResponseEntity gooseAuthDeleteItemUris( @Parameter(nam..

SpringBoot 2022.10.05

jib 배포, 코드 배포, 코드 컨테이너, 앱 컨테이너 만들기

https://alden-kang.tistory.com/1 jib를 이용한 자바 앱 컨테이너화 오늘은 구글 클라우드 도구 중 하나인 jib를 이용한 자바 애플리케이션 컨테이너화 과정에 대해 살펴보려고 합니다. jib가 무엇인지 궁금하신 분들을 위해 간단한 설명과 예제 애플리케이션을 alden-kang.tistory.com 해당 출처를 기반으로 만들었습니다. 본 블로그에서는 java 11을 활용했습니다. jib은 해당 명령어를 실행하면 설정되어 있는 컨테이너 장소에 이미지를 push 하는 명령어이다. 자세한 내용은 출처에 있다. 바로 시작 build.gradle에 아래와 같이 설정한다. plugins { id 'org.springframework.boot' version '2.7.1' id 'io.spri..

SpringBoot 2022.07.15

String, StringBuilder, StringBuffer 사용법 및 차이

String 불변(Immutable) String text = "Hello World" text += "!!!!" // Hello World!!!! "Hello World" + "!!!!" 내용이 합쳐져서 "Hello World!!!!" 처럼 보일 수 있지만 text가 가지고 있는 "Hello World!!!!" 값은 새로운 메모리 영역을 가르키게 된다. 처음 선언했던 "Hello World" 로 할당 되어있는 메모리 영역은 Garbage로 남아있다가 GC(Garbage Collection)에 의해 사라지게 된다. String은 불변하기 때문에 문자열을 다시 선언하는 시점에서 새로운 String 인스턴스가 생성된 것이다. 변하지 않는 문자열을 자주 호출할 경우 String 클래스가 적절할 수 있으나 문자..

SpringBoot 2021.12.23

통신 중 실패했을 때 재시도하기 (@Retryable, @Recover)

@retryable, @recover, retryTemplate, execute method를 활용했다. 위 내용의 예시로 Redis 통신이 실패했을 때(끊어졌을 때) @Retryable, @Recover를 활용 혹은 method가 실패했을 때 retryTemplate.execute 메서드 활용 일정 횟수 재시도 하여 결과를 반환하는 방식을 사용할 것이다. Amazon ElastiCache for Redis면 Redis 통신이 실패할 일이 없겠지만 직접 구축한 Redis라면 언제나 통신이 실패할 일을 염두해 두어야 한다. 그래서 위 같은 로직을 만들었다. 흐름은 아래와 같다. @SpringBootApplication @EnableRetry public class SampleTokenApplication ..

SpringBoot 2021.12.22