1️⃣ 요구사항 정리
Lv 5. 다양한 예외처리 적용하기 도전
- Validation을 활용해 다양한 예외처리를 적용
- 정해진 예외처리 항목이 있는것이 아닌 프로젝트를 분석하고 예외사항을 지정
- Ex) 할일 제목은 10글자 이내, 유저명은 4글자 이내
- @Pattern을 사용해서 회원 가입 Email 데이터 검증 등
- 정규표현식을 적용
Lv 6. 비밀번호 암호화 도전
- Lv.3에서 추가한 비밀번호 필드에 들어가는 비밀번호를 암호화
- 암호화를 위한 PasswordEncoder를 직접 만들어 사용합
4️⃣ 주요 코드
더보기
(CreateAuthorRequestDto.java)
package com.example.schedulerjpa.dto.request;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
public class CreateAuthorRequestDto {
@NotBlank(message = "아이디를 적어주세요")
@Size(max = 15, message = "아이디는 15자 이하로 입력해주세요")
private String loginId;
@NotBlank(message = "이름을 적어주세요")
@Size(max = 5, message = "이름은 5자 이하로 입력해주세요")
private String name;
@NotBlank(message = "비밀번호를 적어주세요")
@Size(min = 6, message = "비밀번호는 6자 이상 입렵해주세요")
@Pattern(
regexp = ".*[!@#$%^&*(),.?\":{}|<>].*",
message = "비밀번호에는 특수문자가 최소 1개 이상 포함되어야 합니다.")
private String password;
}
(PasswordEncoder.java)
public interface PasswordEncoder {
String encode(String rawPassword);
boolean matches(String rawPassword, String encodedPassword);
}
(SimplePasswordEncoder.java)
/**
* SHA-256 알고리즘을 사용하여 비밀번호를 암호화하고,
* 입력값과 암호화된 값을 비교하는 간단한 PasswordEncoder 구현체
*/
@Component
public class SimplePaswordEncoder implements PasswordEncoder{
/**
* 비밀번호를 SHA-256 방식으로 해싱하여 암호화합니다.
*
* @param rawPassword 사용자가 입력한 비밀번호
* @return 해싱된 암호 문자열 (16진수)
*/
@Override
public String encode(String rawPassword) {
try {
// SHA-256 알고리즘을 사용하는 MessageDigest 인스턴스 생성
MessageDigest digest = MessageDigest.getInstance("SHA-256");
// 입력한 비밀번호를 UTF-8 바이트 배열로 변환하여 해싱 수행
byte[] hash = digest.digest(rawPassword.getBytes(StandardCharsets.UTF_8));
// 해싱된 바이트 배열을 16진수 문자열로 변환
StringBuilder hex = new StringBuilder();
for (byte b : hash) {
// 바이트 값을 2자리 16진수로 포맷팅하여 문자열에 추가
hex.append(String.format("%02x", b));
}
//최종적으로 생성된 해시 문자열 반환
return hex.toString();
} catch (NoSuchAlgorithmException e) {
// SHA-256 알고리즘을 사용할 수 없는 경우 런타임 예외 발생
throw new RuntimeException("암호화에 실패했습니다", e);
}
}
/**
* 입력된 비밀번호를 encode()한 결과가 기존 해시된 비밀번호와 일치하는지 확인합니다.
*
* @param rawPassword 사용자가 로그인 시 입력한 비밀번호
* @param encodedPassword DB 등에 저장된 암호화된 비밀번호
* @return 일치 여부
*/
@Override
public boolean matches(String rawPassword, String encodedPassword) {
return encode(rawPassword).equals(encodedPassword);
}
}
📌 GitHub 저장소: https://github.com/sukh115/schedulerJpa/lv6
GitHub - sukh115/schedulerJpa
Contribute to sukh115/schedulerJpa development by creating an account on GitHub.
github.com
'SPRING' 카테고리의 다른 글
| [Spring Boot + JPA] LV.8 (1) | 2025.03.28 |
|---|---|
| [Spring Boot + JPA] LV.7 (1) | 2025.03.28 |
| [Spring Boot + JPA] LV.3 + LV.4 (1) | 2025.03.28 |
| [Spring Boot + JPA] LV.2 (1) | 2025.03.28 |
| SPRING[Spring Boot + JPA] LV.1 (1) | 2025.03.28 |