[SpringBoot] 위험했던 실수, AttributeConverter로 비밀번호 암호화 하기

유알·2023년 2월 16일
0

[Spring]

목록 보기
6/17

Entity의 password 부분에 붙여서 쓰려고 만든 Converter이다.

import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;


//한 방향으로만 암호화 되는 컨버터
//db 데이터를 가져올땐 그냥 가져옴
@Component
@Converter
public class PasswordConverter implements AttributeConverter<String, String> {
    @Autowired
    PasswordEncoder passwordEncoder;



    @Override
    public String convertToDatabaseColumn(String attribute) {
        return passwordEncoder.encode(attribute);
    }

    @Override
    public String convertToEntityAttribute(String dbData) {
        return dbData;
    }
}

나의 의도는 당연히 DB에 저장할때 암호화를 해서 저장 후, 조회할 때는 DB에 저장된 암호화된 값을 그대로 가져오는 Converter를 만드려고 한 것이다.

그런데 이 분 글을 읽으면서 굉장히 잘못된 방법이라는 것을 알게 되었다.
https://velog.io/@jkh9615/Spring-Security%EC%99%80-Attribute-Converter

이 방법을 그대로 쓰면 계속해서 암호화가 중복해서 일어나기 때문에 완전히 오작동한다.

예를 들면 : 다른 컬럼을 수정하는 작업을 할때

--회원가입--

  1. 정상적으로 암호화 되어 DB에 저장

--추후이름 바꾸기--
내부적으로 UPDATE를 실행하면서

  1. DB의 암호화 된 값을 불러와서 객체에 저장
  2. 다시 수정된 값 집어 넣을때 암호화 된 값을 한번 더 암호화

이런 식이다.
즉 Converter는 DB와 엔티티 간의 완전히 상호 전환 가능한 데이터를 다룰때만 사용하도록 하자.

profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글