오랜만에 사이드 프로젝트를 진행하면서 Docker를 다시 사용했는데 웹서버로 Nginx를 사용하면서 다른 컨테이너로 리버스 프록시를 못하는 문제를 마주하게 되었다. 프로젝트의 통신 흐름은 위 그림처럼 진행이 된다. 1. 사용자가 HTTP 요청을 보냄2. Nginx는 HTTP 요청을 잡아서 스프링부트로 요청을 전달 그러나 위 과정을 진행하면서 생각도 못했던 문제를 마주하게 되었다. 그 문제는 도커 네트워크 불일치 문제로 인해 Nginx가 받은 HTTP 요청을 스프링부트로 못넘기는 문제였다. 도커 컨테이너끼리의 통신은 도커 네트워크를 통해 이루어지게 되는데 통신하려는 두 컨테이너가 같은 네트워크를 사용하고 있지 않아서 발생한 문제이다. 나는 컨테이너를 구축할 때 아래의 방법으로 컨테이너를 구축..
작성하려던 API는 하루 방문자 수를 단순히 COUNT 하는 쿼리였다. /** * 오늘 하루 방문자 수 조회하는 메서드 * */ public long dailyVisitedCount() { LocalDateTime startDate = LocalDate.now().atStartOfDa..
AES를 통해 암, 복호화를 진행하고 있었는데 복호화를 하던 도중 아래의 에러 메시지를 마주했다. Input length must be multiple of 16 when decrypting with padded cipher (복호화를 진행할 때는 길이는 16의 배수여야 한다.) 대충 예상하기로는 길이가 안 맞다거나, 알고리즘이 다르거나라고 생각했다. 인터넷을 찾아보니 대표적인 발생 원인은 아래와 같다. 1. 암호화 후 다른 방식으로 또 암호화를 한 경우. 즉 AES로 암호화 하고 BASE64로 한번 더 암호화 했다면 BASE64 디코딩부터 해야 한다.-> 나의 경우는 이중 암호화는 없었기에 위 상황은 아니었다. 2. 애초에 암호화가 되어있지 않은 경우 암호화를 해놓은 데이터인 줄 알았지만 알고보..
토이프로젝트를 진행하려고 yml 설정을 하고 있었는데 MySQL을 연결하기 위한 yml 설정 중에 driver-class-name: com.mysql.cj.jdbc.Driver에 빨간 글씨가 뜨는 문제가 있었다. 이 상태로 애플리케이션을 동작시키면 dataSource 빈 이름을 만들다 에러가 발생했다고 나온다. 위 문제는 build.gradle에서 해결할 수 있다. 스프링부트에서 mysql을 사용하기 위해 'mysql:mysql-connector-java'라는 의존성을 추가해 주게 되는데 이때 MySQL의 버전을 따로 지정해주지 않아서 발생한 문제다. 예상하기로는 뒤에 버전을 명시하지 않으면 현재 의존성들과 호환이 되는 버전을 자동으로 가져와서 실행하게 되어 있는데, 여기서 뭔가 충돌이 발생하지 않았..
해당 게시글은 스프링 시큐리티 5.7 이하 버전으로 진행했습니다. 오늘 스프링 시큐리티를 만지면서 로그인 시도를 하면 쿠키에 존재하는 CSRF 토큰이 자꾸 갱신돼서 CSRF 토큰 불일치 문제가 발생했었다.(해결에만 5시간을 쏟았다.) CSRF의 경우 아래처럼 쿠키에 저장하도록 설정했다. 이렇게 설정하면 CSRF 토큰이 쿠키로 만들어져서 저장이 된다. 클라이언트는 해당 쿠키를 서버로 넘겨서 서버의 CSRF와 일치하는지 판단..csrf(csrf -> csrf .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())) 가상의 시..
데이터를 중앙 집중식으로 관리하기 위해 기존에는 Vuex를 사용했었는데 ?? 대체 언제 Pinia가 공식으로 바뀌었던가.. 그래서 Pinia로 전면 수정을 하는데 자꾸 persistedstate가 적용이 안 되는 문제가 발생했다.(이 글을 작성하는 시점은 이 에러를 만난 지 벌써 3시간째) gpt4, also gpt2, 스택오버플로우 전부 확인했지만 실패 main.jsimport { createApp } from "vue";import { createPinia } from "pinia";import piniaPluginPersistedstate from "pinia-plugin-persistedstate";import App from "./App.vue";import router from "./rout..
리프레시 토큰 재발급 API를 만들면서 문제가 발생했다. API의 요구사항은 다음과 같다. accessToken, refreshToken 2개의 쿠키를 필수로 전달. jwt 필터 건너뜀. 스프링 시큐리티 건너뜀. 즉 2개의 쿠키를 전달해 준다면 일치하는 리프레시를 찾아서 살아있다면 재발급을 진행해 주는 형식이다. 컨트롤러 @PostMapping("refresh-token") public ResponseEntity
오랜만에 QueryDSL을 통해 쿼리를 작성하려고 하는데 RefreshToken Entity에서 큐클래스가 임포트 불가능한 문제가 발생했다. 다른 Entity에서는 사진처럼 잘 import가 되고 있는데 RefreshToken만 import하면 빨간줄 떴다가 바로 삭제가 돼서 QClass가 없나 싶어서 확인해봤다. 분명 QClass는 다 만들어져 있는데?.. 여기서 아차 싶은 부분이 생겼다 대부분 보통 QClass는 build/generated 폴더에 만드는 걸로 알고 있는데 내 코드는 src/main에 생성하도록 지정이 되어 있던 것. 근데 여태까지 문제 없이 사용했는데? 이 방법이 진짜 문제가 없는 건지 궁금해지기 시작했다. 일단 김영한님도 그렇고 호돌맨님의 인프런 댓글도 확인해본 결과 전부 buil..