Spring boot kim's Shop/문자인증

Spring boot Jwt+휴대폰인증!(1) with Coolsms

디비드킴 2021. 7. 26. 15:31

버그+효율성 때문에

리팩토링 하였습니다

https://cordingmonster.tistory.com/132?category=1041862 

 

Springboot 인증 시스템 리팩토링!(2) with interface

이전소스 https://cordingmonster.tistory.com/107?category=1038496 " data-og-host="cordingmonster.tistory.com" data-og-source-url="https://cordingmonster.tistory.com/107?category=1038496" data-og-imag..

cordingmonster.tistory.com

 

이제 전화인증을 구현할 건데
아임 포트를 사용하려 했으나...
다날 서비스를 신청해야 하고
다날 서비스 신청에는
사업자등록증이 필요해서
허접하지만 직접 구현했다!

1. 세션
인증을 요청-> 세션에 번호/인증번호/여부 저장
->인증 확인 후-> 세션 여부 TRUE로 변환
하려 했으나 포트 번호가 달라서 그런지
인증번호 요청 후-> 번호 제출했을 때
->세션이 null이었다

2.db이용
그래서 인증 db를 만들어서
인증번호 요청-> db저장-> 인증번호 비교-> db true로 변환
이렇게 구현했다

출발해 보자!

confrimDto

confrimDto.java

이메일 인증 구현도
같이 사용할 예정이다

하루 횟수 제한을 두기 위해
인증 요청 회수 기록
@Column(name="requesttime",nullable = false,length = 2)
@ColumnDefault("1")
private int requestTime;
유효시간을 체크하기 위해
인증 시간을 저장한다
@Column(name="created")
@CreationTimestamp
private Timestamp created;

confrimDao

confrimDao.java


같은 번호로 재요청 시
또 insert를 하는 게 아니라
update를 해주기 위해
쿼리를 작성해주자
@Modifying
@Transactional
@Query(value = "UPDATE confrim c SET phone_temp_num=?1,requesttime=?2,created=?3 WHERE c.phone_num=?4",nativeQuery = true)
void updatePhoneTempNum(String tempNum,int requestTime,Timestamp timestamp,String phoneNum);

servcie

인증 10회 시도 시에도 실패하면
하루 동안 인증을 제한할 것이다
토큰 유효기간 체크 때 썼던 함수를 재활용하자

utillservice.java

타임스탬프-> 로컬 데이트로 변환
LocalDateTime timestamp2=timestamp.toLocalDateTime();
변환 날짜에 기간 추가해주기
timestamp2=timestamp2.plusDays(refreshTokenValidity);
현재 날짜 시간 가져오기
LocalDateTime today= LocalDateTime.now();
비교하기
if(timestamp2.isBefore(today))

그다음 현재 날짜 시간을 timestmp로 주는 함수를 만들자

utillservice.java

현재시간 타임스탬프 생성
new Timestamp(System.currentTimeMillis());

coolsms는
이전 토이 프로젝트 때
만들어 논 걸사용하자!
https://cordingmonster.tistory.com/81?category=1034324

 

Springboot  문자 인증/전송!(1) with coolsms And Message

api방식을 사용하고 싶었는데 https://docs.coolsms.co.kr/authentication/api-key API Key 인증 방식 docs.coolsms.co.kr 진짜 토큰 받는 방식이 말도 안돼서 몇 시간 동안 고민하다가 어찌어찌했는데 보내려고..

cordingmonster.tistory.com



이제 본격적으로 service를 만들러 가자!

confrimService

confrimService.java

일단 처음 왔을 때
핸드폰 번호를 받고
임시 번호를 만들어주자
String phoneNum=request.getParameter("phoneNum");
String tempNum=utillService.GetRandomNum(6);
이미 등록된 번호인지 확인한다
if(userService.confrimPhone(phoneNum))

이미 등록된 번호도 아니고
처음 요청이라면 insert 실행
insertConfrim(phoneNum, tempNum);
sendSms(phoneNum, tempNum);

아니라면
요청 기록이 존재한다면
마지막 요청이 하루가 지났는지
안 지났는지 검사
if(utillService.checkDate(confrimDto.getCreated(),coolTime)

지났다면
기존 요청 삭제 후
새로운 요청 생성
deleteCofrim(confrimDto);
insertConfrim(phoneNum, tempNum);
sendSms(phoneNum, tempNum);
이렇게 하는 이유는
또 10번 검사+유효시간 검사를
해야 하기 때문이다

++20210821

deleteCofrim(confrimDto);이 없어야 

정상적으로 재발급된다 

마지막 리팩토링 글을 참고!

하루가 안 지났다면
요청 횟수 검사
if(confrimDto.getRequestTime()<=10)

10 이하라면
전송
updateconfrim(confrimDto, tempNum);
sendSms(phoneNum, tempNum);

아니라면
하루 요청 초과 메시지 전송
return utillService.makeJson(cofirmEnums.tooManyTime.getBool(), cofirmEnums.tooManyTime.getMessege());

흐름을 봤으니
이제 디테일한 서비스를 봐보자!

confrimService

confrimService.java

기존 confrim db에
요청이 존재하는지 확인
private confrimDto findConfrim(String phoneNum)
insert함수
private void insertConfrim(String phoneNum,String tempNum)
update함수
private void updateconfrim(confrimDto confrimDto,String tempNum)
delete함수
private void deleteCofrim(confrimDto confrimDto)
메시지 전송 함수
private void sendSms(String phoneNum,String tempNum)

 

restcontroller

restcontroller.java


프런트

js


테스트

mysql
mysql

실제 사용 중인 번호여서
번호는 빼고 올린다
10번째까지 전송했다
요청 시간/인증번호/요청 회수
모두 잘 바뀐다

사실 돈 아까워서
두 번만 했다

11번째 전송 10회 초과 전송

가지 않는다
24시간 뒤에 전송이 가능하다!

다음번엔 이제 인증번호를 판별해보자!

 

버그+효율성 때문에

리팩토링 하였습니다

https://cordingmonster.tistory.com/132?category=1041862 

 

Springboot 인증 시스템 리팩토링!(2) with interface

이전소스 https://cordingmonster.tistory.com/107?category=1038496 " data-og-host="cordingmonster.tistory.com" data-og-source-url="https://cordingmonster.tistory.com/107?category=1038496" data-og-imag..

cordingmonster.tistory.com