SPRING

[Spring Boot + JPA] LV.5+ Lv.6

도원좀비 2025. 3. 28. 15:19

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