일단 프로젝트 초기 설정 먼저 해줄 생각이다.
추후에 AWS든, NCP든 클라우드 플랫폼과 그에 맞춰 DB를 사용할테지만
일단 Docker를 통한 MySQL과 Spring Security, JWT 설정 등 Config 설정을 먼저 해주도록 하겠다.
일단 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 관련되서 세팅을 해줄 예정이다.
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 서명용 시크릿 키 생성 및 해시 작업을 담당한다.
hashSecret(byte[] secretKey, String algorithm)getSecretKey(String base64Secret, String algorithm)그래서 이 유틸클래스를 사용한다면 다음과 같은 성과를 얻을 수 있다.
| 항목 | 설명 |
|---|---|
| 책임 분리 | JwtSecretHashUtil이 키 생성/해싱 담당, JwtProvider는 JWT 생성/검증 로직에 집중 가능 |
| 보안 관리 | 원시 시크릿을 직접 사용하지 않고 해싱하거나 SecretKeySpec으로 관리하여 보안성 향상 |
| 재사용성 | 다양한 서비스/환경에서 같은 방식으로 SecretKey를 구성 -> 통일된 키 관리 가능 |
Spring Security도 인터넷에 아주 많이 나와있고 그만큼 설정도 다양하기 때문에
해당 부분을 보고 구현해줬다.
내일은 AOP, logback, Swagger 등을 추가로 설정해보자