인기 글

  • Spring - 이메일 인증 구현해보기 (랜덤 인증번호 보내기)

    배경 새로 시작하게 된 프로젝트에서 회원가입 중 이메일 인증을 하도록 했다. Spring에서 제공하는 API를 사용하면 생각보다 쉽게 구현할 수 있다. 나는 Google SMTP 서버를 이용해서 이메일 인증을 진행하도록 했다. 개발 환경 Java 11 Spring 2.x Gradle MySQL, Redis IntelliJ 흐름 사용자는 회원가입 화면에서 가입하려는 이메일을 입력 후 이메일 인증 버튼 클릭 클라이언트 서버에게 사용자의 이메일로 인증 번호 전송 요청 서버는 랜덤 인증 번호 생성. 인증 번호를 Redis에 저장 후 사용자의 이메일로 인증 번호 전송 사용자는 인증 번호 확인 후 인증 번호 입력 후 확인 버튼 클릭 클라이언트는 서버에게 인증 번호 검증 요청 서버는 전달받은 인증 번호가 Redis에..

  • IntelliJ Error - finished with non-zero exit value 1 해결 방법

    Execution failed for task ':Application.main()'. > Process 'command 'JDK경로/bin/java.exe'' finished with non-zero exit value 1 이번에 소개할 에러는 finishi with non-zero exit value 1 이 녀석이다. Intellij, Gradle 환경에서 Spring 코드를 실행한 후 해당 에러를 만났다. 해결 방법 [File > Settings > Build, Excution, Deployment > Build Tools > Gradle] 이 경로로 이동 [Build and run using]과 [Run tests using]을 IntelliJ IDEA로 변경 [Gradle JVM] 버전을 현재 ..

  • Python - ModuleNotFoundError: No module named 원인과 해결 방법 (가상환경 pip)

    개요 프로젝트를 진행하는 과정에서 자바에서 파이썬 스크립트를 실행시켜야 할 필요가 있었다. 파이썬 관련 환경 설정과 스크립트 실행 코드는 타 팀에서 작업을 작업해주셨다. PythonScriptExecutor 아래는 자바에서 파이썬 스크립트를 실행시키기 위한 코드이다. @Slf4j @Component @NoArgsConstructor(access = AccessLevel.NONE) public class PythonScriptExecutor { public static void execute() { try { // Python 스크립트 경로 String pythonScriptPath = "/path/python_script.py"; // Python 가상환경 활성화 String virtualEnvPath ..

  • Java - ArrayIndexOutOfBoundsException 원인과 해결법

    원인정해진 배열의 크기보다 크거나 음수 index에 대한 요청이 있으면 ArrayIndexOutOfBoundsException이 발생한다.배열의 index는 1부터 시작하는 것이 아닌 0부터 시작한다. 배열의 크기를 n이라고 한다면 index는 1부터 n까지가 아닌 0부터 n-1까지인 것이다. 보통 이 부분에서 해당 예외가 많이 발생하는 것 같다.ArrayIndexOutOfBoundsException은 자바 컴파일러에서 검사하지 않고 실행을 시켜야 알 수 있다.int[] arr = new int[5] // arr의 범위는 arr[0] ~ arr[4]로 총 5개의 인덱스를 생성arr[5] = 5; // arr[5]는 존재하지 않기 때문에 예외 발생!// 결과Exception in thread "main" ..

  • SSH - ssh no matching key exchange method found 에러 원인과 해결 방법

    ssh chanbin@192.168.0.100 Unable to negotiate with 192.168.0.100 port 22: no matching key exchange method found. Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 원인 ssh6 까지는 제공해주던 key exchange method가 ssh7부터는 보안의 이유로 별도 옵션을 추가해주어야 한다. 해결 방법1 ssh에 접속할 때 key exchange method 옵션을 담아 접속한다. ssh -oKexAlgorithms=diffie-hellman-group-exchange-sha1 cha..

  • Spring - Redis를 사용해보자

    배경 진행 중인 프로젝트의 Security 작업을 담당하면서 JWT Refresh Token을 Redis에 저장하여 관리하기로 했다. 왜 Redis? Redis는 메모리 기반의 Key-Value 저장소이다. 메모리에 데이터를 저장하기 때문에 훨씬 빠르게 데이터에 접근할 수 있다. 따라서, Redis를 캐시로 사용하면 웹 서버에서 반복적으로 사용되는 데이터를 메모리에 저장하여 매번 데이터베이스에서 읽어오는 비용을 아낄 수 있다. 가장 큰 이유는 Redis는 TTL(Time-To-Live) 기능을 제공하기 때문에 데이터의 만료 시간을 설정할 수 있기 때문이다. 이를 통해 서버에 저장할 Refresh Token의 만료 시간을 쉽게 설정할 수 있게 된다. 만료된 Refresh Token은 Redis에서 자동으로..

  • Github - Pull request template 작성과 설정

    💡Pull request template은 왜 필요할까? PR의 내용이 중요한 이유는 Pull Request를 통해 코드 리뷰를 받기 때문입니다. 코드 리뷰를 통해 팀원 간의 코드 스타일을 맞출 수 있고, 혼자서는 발견하기 어려운 위험 요소도 발견할 수 있습니다. PR 내용만으로도 변경 사항과 이유를 충분히 이해할 수 있어야 합니다. PR Template을 만들어 Repository에 추가하면 PR을 할 때 PR body에 template의 내용을 자동으로 볼 수 있습니다. PR의 내용을 표준화해서 일관성 있는 좋은 품질의 Pull Request를 유지할 수 있습니다. pull_request_template.md 파일 생성 프로젝트의 Repository에서 파일을 생성합니다. 템플릿은 다음 위치 중 한 ..

  • Spring - Spring Security + JWT 4편: Access Token 재발급

    Spring Security + JWT 적용기 3편: 로그아웃에 이어지는 글입니다. Spring - Spring Security + JWT 적용기 3편: 로그아웃 Spring Security + JWT 적용기 2편: JWT검증 이어지는 글입니다. Spring - Spring Security + JWT 적용기 2편: JWT 검증 `Spring Security + JWT 적용기 1편: 로그인`에 이어지는 글입니다. Spring - Spring Security + JWT 적용기 1 green-bin.tistory.com 이번에는 Refresh Token으로 Access Token을 재발급하는 과정에 대해 정리해보려고 한다. 왜 Refresh Token을 사용할까? 로그인을 통해 JWT를 발급 받고 요청을 보낼..

  • Java - AES-128 양방향 암호화하기

    RefreshToken을 쿠키로 전달할 때 보안을 강화하기 위해 AES128 양방향 암호화를 적용했다.RefreshToken은 사용자가 재인증할 필요 없이 새로운 AcessToken을 발급받도록 해준다. 만약 해커가 RefreshToken을 가로채면 암호를 사용자의 계정에 접근하는데 사용할 수 있다. 이 때, AES128 암호화로 RefreshToken을 암호화하면 RefreshToken을 가로채더라도 사용하기 어려워진다. (물론 이 방법 또한 완벽하지 않다.)AES(Advanced Encryption Standard) 암호화저장중이거나 전송하려는 데이터를 보호하는 데 사용되는 대칭 암호화 알고리즘. 고정된 크기의 데이터 블록에 데이터를 암호화하는 블록 암호 암호화 알고리즘이다.AES 암호화는 ..

  • Spring - 중복된 Bean이 없는데도 발생하는ConflictingBeanDefinitionException 원인과 해결 방법

    배경 파일을 이동하거나 삭제하는 작업 이후 ConflictingBeanDefinitionException을 만날 때가 있다. nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'memberRepository' for bean class [클래스 경로] conflicts with existing, non-compatible bean definition of same name and class [중복된 클래스 경로] 일반적으로 ConflictingBeanDefinitionException는 중복으로 등록된 클래스가 존재할 때 발생하는 ..