otp는 유저 인증을 위해 사용되는 인증 코드이다.
이러한 인증코드는 당연 난수로 만들어지게 된다. 즉, 랜덤(random)한 값으로 만들어지게 된다.
그렇다면 OTP 코드를 math.random()으로 간단히 구현하면 될까?
아니다. random은 치명적인 단점을 가지고 있다.
Random의 단점과 SecureRandom의 장점
Random의 단점과 SecureRandom의 장점은 본문을 작성하는 이유이자 핵심적인 부분이다.
우선 Random과 SecureRandom은 난수를 만든다는 점에서 공통점이 있다.
하지만 "Random은 가짜 난수"를 "SecureRandom은 진짜 난수"를 생성한다.
"Random은 가짜 난수"
random은 '의사난수(Pseudo Random)'이다. 의사난수란 특정한 규칙에 의해 만들어진 난수를 뜻하며, 사람이 보기에 난수이지만 "같은 시드값"을 주입하면 똑같은 난수를 제공하는 난수를 뜻한다. 여기서 "시드값"은 난수를 결정하는 특정한 값을 이야기하는데 진정한 난수는 시드값 또한 난수로 생성되어야한다. 따라서 진짜 난수는 시드값이 같아도 다른 수가 출력되어야하는 반면, random은 같은 수가 출력되기 때문에 가짜 난수라고 말하는 것이다.
"SecureRandom은 진짜 난수"
그렇다면 SecureRandom은 진짜 난수일까?
결론적으로 말하자면, 아니다. SecureRandom도 의사난수이기 때문이다. 하지만, SecureRandom은 최대 128비트의 범주 안에서 난수를 생성하고 random은 최대 48비트의 범위에서 난수를 생성하기 때문에 난수가 반복될 가능성이 현저히 낮다. 이는 2^48 번의 시도 중 반복값이 나올 확률과 2^128번의 시도 중 반복되는 값이 나올 확률이기 때문에 매우 큰 차이가 있음을 알 수 있다.
오늘의 결론
SecureRandom을 사용하자.
'개발일지 > Today I Learn' 카테고리의 다른 글
[ 코딩 점검 ] 숫자에 천단위 콤마(쉼표) 찍기 (1) | 2023.07.19 |
---|---|
[ 개발 일지 ] IT 채용 한파와 비전공자 개발자의 준비 (1) | 2023.07.17 |
[ TIL ] 명령형 프로그래밍과 선언형 프로그래밍 (0) | 2022.11.29 |
[ TIL ] JPA에 대한 고민 (0) | 2022.11.28 |
[ TIL ] Spring Data JPA에서 save() 메서드의 쓰임 (0) | 2022.11.22 |