(14) PK 를 auto increment(자동 증가) 할 경우 생기는 문제점

728x90

PK 값을 DB 에서 부여해주는 그대로 1, 2, 3, 4... 와 같이 1씩 증가하는 PK 로 설정할 경우 몇가지 문제점이 발생한다.

  • 1씩 증가하는 형식은 ID 의 앞 뒤로 다른 user 의 PK 값임을 쉽게 예측할 수 있으며 악의적인 공격에 취약하다.
  • 새 항목을 생성하고 해당 ID 를 검사하면 테이블의 행 수를 알 수 있다.(정보가 공개된다.)
  • 각 테이블이 순차적인 값을 가지므로, 동일한 값이 다른 엔티티의 기본키로 발견된다.
  • 1씩 증가하는 방식은 범위가 한정적이기 때문에 서비스를 이용하는 수가 폭발적으로 증가하면 고갈이 될 수 있다.

이러한 문제점을 해결하기 위해 UUIDv4 를 PK 로 선정하여 문제를 해결할 수 있다.

  • uuid 란 'c0b656b1-7351-4dc2-84c8-62a2afb41e66'와 같이 16진수로된 128비트로 구성된 값이다.uuid는 버전1 ~5까지 있다.  버전1은 날짜-시간 및 MAC주소 기반으로 구성되고, 버전3는 네임 스페이스 이름을 해싱해서 생성하는 방식으로 UUID를 생성한다. 버전4는 무작위로 생성한다. 위키피디아 다음 위키백과에 따르면 UUID가 충돌할 확률은 10억분의 1이라고 하니 상당히 안전한 값이라고 볼 수 있다.
  • uuid 를 사용하면 앞서 말한 방식의 문제점 3가지를 해결할 수 있다.
    • 생성되는 id가 데이터베이스 전체 pk에서 유일한것을 보장받는다.따라서 앞서 말한 pk의 고갈문제와 보안적인 부분 해결된다.
    • 각 테이블에 얼마나 많은 값이 있는지 모름.
    • uuid는 보편적으로 적용가능 하다. (만약 자동 증가 기본키를 생성하는 기능이 없는 데이터 베이스로 변경 해야하는 경우..)
  • 단점으로는 int형에 비해서 길이가 너무 길어서 스토리지 및 성능문제가 발생한다. 
@Entity
public class Users {
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(
            name = "UUID",
            strategy = "org.hibernate.id.UUIDGenerator"
    )
    private UUID id;
}

위는 JPA 를 사용하여 uuid 버전 4로 entity 를 구성한 방법이다.

728x90