1?달 성장 - 프로젝트 초기 설정 (1)

김원기·2025년 7월 21일

1?달 성장

목록 보기
4/5

본론

일단 프로젝트 초기 설정 먼저 해줄 생각이다.

추후에 AWS든, NCP든 클라우드 플랫폼과 그에 맞춰 DB를 사용할테지만
일단 Docker를 통한 MySQL과 Spring Security, JWT 설정 등 Config 설정을 먼저 해주도록 하겠다.

Docker-compose

일단 DB는 Docker를 이용한 MySQL을 띄울 생각이다.
Docker-compose를 이용할것이며 추후 CI/CD툴로 사용될 예정이다.

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: collaboapp-mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 
      MYSQL_DATABASE: 
      MYSQL_USER: 
      MYSQL_PASSWORD: 
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

일단 간단하게 이렇게만 설정해주겠다.

JWT

그 다음은 JWT 관련되서 세팅을 해줄 예정이다.

implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

먼저 build.gradle에 의존성을 먼저 추가해주자.

그 다음 global.jwt, global.config쪽에 설정을 추가하자.

그 외에 기본적이 JWT 설정은 Config, Provider, AuthFilter 등으로 인터넷에 돌아다니는 형태와 유사하게 진행했다.

다만 이것 하나는 조금 다르게? 진행할 예정인데

@Component
public class JwtSecretHashUtil {

    public String hashSecret(byte[] secretKey, String algorithm) throws Exception {
        Mac hmac = Mac.getInstance(algorithm); // HmacSHA256 or HmacSHA512
        SecretKeySpec keySpec = new SecretKeySpec(secretKey, algorithm);
        hmac.init(keySpec);
        byte[] hashedBytes = hmac.doFinal("jwt-secret".getBytes());
        return Base64.getEncoder().encodeToString(hashedBytes);
    }

    public SecretKey getSecretKey(String base64Secret, String algorithm) {
        try {
            byte[] decodedSecret = Base64.getDecoder().decode(base64Secret);

            // 단순화된 방식
            return new SecretKeySpec(decodedSecret, algorithm);
        } catch (Exception e) {
            throw new RuntimeException("Failed to create secret key", e);
        }
    }
}

이렇게 JwtSecretHashUtil 이라는 유틸클래스를 하나 더 생성했다.
해당 클래스는 JWT 서명용 시크릿 키 생성 및 해시 작업을 담당한다.

  1. hashSecret(byte[] secretKey, String algorithm)
  • 지정된 secretKey를 지정한 알고리즘을 통해 Base64 인코딩된 해시 문자열로 반환한다.
  • 단순하게 민감 정보 노출 위험을 낮추는 용도로 사용이 가능하다.
  1. getSecretKey(String base64Secret, String algorithm)
  • Base64로 인코딩된 시크릿 문자열을 디코딩한 후 SecretKey 객체로 변환한다.
  • JWT 생성 및 검증에 필요한 javax.crypto.SecretKey 객체를 생성할 때 사용된다.
  • 코드에서 직접 SecretKeySpec을 만들지 않고 유틸로 분리하여 응집도 향상 & 재사용성 증가한다.

그래서 이 유틸클래스를 사용한다면 다음과 같은 성과를 얻을 수 있다.

항목설명
책임 분리JwtSecretHashUtil이 키 생성/해싱 담당, JwtProvider는 JWT 생성/검증 로직에 집중 가능
보안 관리원시 시크릿을 직접 사용하지 않고 해싱하거나 SecretKeySpec으로 관리하여 보안성 향상
재사용성다양한 서비스/환경에서 같은 방식으로 SecretKey를 구성 -> 통일된 키 관리 가능

Spring Security

Spring Security도 인터넷에 아주 많이 나와있고 그만큼 설정도 다양하기 때문에
해당 부분을 보고 구현해줬다.

끝!

내일은 AOP, logback, Swagger 등을 추가로 설정해보자

profile
혼자 공부하는 블로그라 부족함이 많아요 https://www.notion.so/18067a27ac7e4f4790dde645fb3bf3d3?pvs=4

0개의 댓글