2017-05-01 1 views
1

프런트 엔드와 Java/Spring의 백엔드에서 반응하는 웹 앱을 만들고 있습니다. RESTful API를 사용하여 내 클라이언트와 통신합니다 (클라이언트도 외부 API와 통신 함).Verifaction 코드 저장

현재 문제가 있습니다. 사용자가 등록하면 전자 메일 인증 코드를 보내려고합니다. 제 질문은 연습에 관한 것입니다.

  • 인증 코드가 포함 된 전자 메일을 보내고 코드를 데이터베이스에 저장 한 다음 코드가 올바른지 확인해도됩니까?
  • 또는 잠시 동안 코드를 유지하고 올바른지 확인하는 정적 빈을 만드는 것이 더 낫습니까?

백 엔드 로직 측면에서 어떤 것이 더 좋은지 잘 모르겠습니다.

모든 도움에 감사드립니다.

답변

1

DB에 저장하는 것은 매우 일반적인 습관입니다. 만료 된 토큰을 잠시 정리해야합니다 (어쩌면 새 타이머를 삽입 할 때). 토큰을 메모리 내 캐시 (EhCahe이 마음에 듭니다)에 저장하고 그에 따라 만료 시간을 설정할 수도 있지만 이렇게하면 응용 프로그램이 종료 될 때 캐시가 손실됩니다. 예, 캐시를 영구적으로 만들 수는 있지만 DB 경로를 선택하지 않는 이유는 무엇입니까?

그렇다면 토큰을 어디에도 저장하지 말고 URL 매개 변수로 전자 메일과 링크를 보내고 추가 매개 변수로 소금에 절인 해시를 보내십시오. 링크를 클릭하면 해시가 일치하는지 확인할 수 있습니다. 일치하는 경우 전자 메일 매개 변수가 조정되지 않았으므로 유효성 검사로 표시 할 수 있습니다. 펜타곤 수준의 보안은 아니지만 전자 메일 유효성 검사에 충분할 수 있으며 모든 것을 더 쉽게 만듭니다. 의사 코드에서 : 더이 아이디어를 복용하지만 더와,

String email = httpRequest.getParameter("email"); 
String receivedHash = httpRequest.getParameter("hash"); 
if (hash(email).equals(receivedHash)) { 
    //the user didn't do anything funny, mark email as valid 
} 

을 또는 :의 길에

public String hash(String email) { 
    MessageDigest digester = MessageDigest.getInstance("SHA-256"); 
    digester.update(email.getBytes(StandardCharsets.UTF_8))); 
    digester.update("RanDOmComplCatEdSalt647826583745".getBytes(StandardCharsets.UTF_8)); 
    return Base64.getEncoder().encodeToString(digester.digest()); 
} 

String email = "[email protected]"; 
sendEmailWithLink("/verify?email=" + email + "&hash=" + hash(email)); 

, 당신은 단지 해시가 일치하는 경우 계산하고 확인하는 똑같은 일을 보안을 사용하면 이메일을 포함하고 적절하게 암호화 된 JWT와 같은 것을 생성 할 수 있습니다.

+0

큰 충고, 고마워. – Darlyn