인기 글

Spring - 이메일 인증 구현해보기 (랜덤 인증번호 보내기)
·
Spring
배경새로 시작하게 된 프로젝트에서 회원가입 중 이메일 인증을 하도록 했다.Spring에서 제공하는 API를 사용하면 생각보다 쉽게 구현할 수 있다. 나는 Google SMTP 서버를 이용해서 이메일 인증을 진행하도록 했다. 개발 환경Java 11Spring 2.xGradleMySQL, RedisIntelliJ 흐름사용자는 회원가입 화면에서 가입하려는 이메일을 입력 후 이메일 인증 버튼 클릭클라이언트 서버에게 사용자의 이메일로 인증 번호 전송 요청서버는 랜덤 인증 번호 생성. 인증 번호를 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 - AES-128 양방향 암호화하기
·
Java
개요RefreshToken을 쿠키로 전달할 때 보안을 강화하기 위해 AES128 양방향 암호화를 적용했다.RefreshToken은 사용자가 재인증할 필요 없이 새로운 AcessToken을 발급받도록 해준다. 만약 해커가 RefreshToken을 가로채면 암호를 사용자의 계정에 접근하는데 사용할 수 있다. 이 때, AES128 암호화로 RefreshToken을 암호화하면 RefreshToken을 가로채더라도 사용하기 어려워진다. (물론 이 방법 또한 완벽하지 않다.) AES(Advanced Encryption Standard) 암호화저장중이거나 전송하려는 데이터를 보호하는 데 사용되는 대칭 암호화 알고리즘. 고정된 크기의 데이터 블록에 데이터를 암호화하는 블록 암호 암호화 알고리즘이다.AES 암호화는 데이..
Javascript - Uncaught SyntaxError: Invalid or unexpected token 원인과 해결방법
·
나의 에러 일지
개요 평가 시스템을 만들고 있었다. 요구사항 중 특정 기간에만 url에 접근 가능하도록 설정할 수 있는 요구사항이 있었다. (수강 신청 기간을 떠올리면 된다.) 평가 기간을 지정하면 해당 기간 내에만 url에 접근 가능하고, 기간 외에 접근 시 평가 기간이 아니라는 alert창과 함께 로그인 화면으로 리다이렉트되도록 했다. Service public String checkOfficerEvaluationPeriod() { OfficerEvaluationPeriod officerEvaluationPeriod = this.getOfficerEvaluationPeriod(); LocalDate startDate = officerEvaluationPeriod.getStartDate().toLocalDate(); ..
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..
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" ..
Spring - Redis를 사용해보자
·
Spring
배경 진행 중인 프로젝트의 Security 작업을 담당하면서 JWT Refresh Token을 Redis에 저장하여 관리하기로 했다. 왜 Redis? Redis는 메모리 기반의 Key-Value 저장소이다. 메모리에 데이터를 저장하기 때문에 훨씬 빠르게 데이터에 접근할 수 있다. 따라서, Redis를 캐시로 사용하면 웹 서버에서 반복적으로 사용되는 데이터를 메모리에 저장하여 매번 데이터베이스에서 읽어오는 비용을 아낄 수 있다. 가장 큰 이유는 Redis는 TTL(Time-To-Live) 기능을 제공하기 때문에 데이터의 만료 시간을 설정할 수 있기 때문이다. 이를 통해 서버에 저장할 Refresh Token의 만료 시간을 쉽게 설정할 수 있게 된다. 만료된 Refresh Token은 Redis에서 자동으로..
Spring - @Value가 계속 null을 가져올 때 원인과 해결 방법
·
나의 에러 일지
@Value란?DB 접속 정보나 비밀번호와 같이 민감한 정보를 별도의 파일로 분리해서 환경 정보에 맞는 값을 불러오도록 하는 애너테이션이다. application.properties 또는 application.yml에 값을 설정하면 필드나 메서드에 값을 주입해준다. 배경Refresh Token을 암호화해서 클라이언트에 전달하기 위해 AES128 암호화 클래스를 구현했다. 구현 후 암호화가 잘 이루어지는지 확인하기 위해 테스트를 진행했는데 예외 처리했던 ENCRYPTION_FAILED가 발생했다.확인해보니 @Value 애너테이션을 통해 application.yml로부터 전달받아야 할 secretKey가 제대로 전달 받지 못하고 null을 반환하기 때문에 발생했다. AES128Config@Componentp..
Github - Pull request template 작성과 설정
·
Git
💡Pull request template은 왜 필요할까? PR의 내용이 중요한 이유는 Pull Request를 통해 코드 리뷰를 받기 때문입니다. 코드 리뷰를 통해 팀원 간의 코드 스타일을 맞출 수 있고, 혼자서는 발견하기 어려운 위험 요소도 발견할 수 있습니다. PR 내용만으로도 변경 사항과 이유를 충분히 이해할 수 있어야 합니다. PR Template을 만들어 Repository에 추가하면 PR을 할 때 PR body에 template의 내용을 자동으로 볼 수 있습니다. PR의 내용을 표준화해서 일관성 있는 좋은 품질의 Pull Request를 유지할 수 있습니다. pull_request_template.md 파일 생성 프로젝트의 Repository에서 파일을 생성합니다. 템플릿은 다음 위치 중 한 ..
Cold Bean
개발하는 콩