본문 바로가기
etc./info

[Spring] hCaptcha 적용

by moonsiri 2022. 3. 21.
728x90
반응형

hCaptcha에 대한 설명은 다른 페이지에서 자세히 설명하고 있기 때문에 생략하고

적용하는 방법에 대해 설명하겠습니다.

 

우선 https://dashboard.hcaptcha.com/ 에 회원가입을 하여 Site key와 Secret key를 확인합니다.

 

html에 스크립트와 hCaptcha가 노출될 부분에 코드를 삽입합니다.

<script src="https://hcaptcha.com/1/api.js" async defer></script>

<div class="h-captcha" data-sitekey="사이트키"></div>

(옵션 값 확인 : https://docs.hcaptcha.com/configuration#hcaptcha-container-configuration )

 

그럼 아래와 같이 hCaptcha가 노출이 됩니다.

 

사용자가 캡챠를 성공적으로 통과를 하면 숨겨져 있는 "h-captcha-response"에 값이 추가됩니다.

 

만약 아래와 같이 Warning: localhost detected. Please use a valid host. 란 오류가 발생한다면 hCaptcha가 localhost와 127.0.0.1을 지원하지 않기 때문입니다. https://docs.hcaptcha.com/#local-development

 

C:\Windows\System32\drivers\etc 경로의 hosts에 테스트용 도메인을 추가해주세요.

설정 후 http://{테스트용 도메인}:{port}/{url} 경로로 실행하면 캡챠가 정상적으로 노출됩니다.

 

 

아래는 해당 요청 값으로 서버에서 POST 요청을 하여 캡챠 응답을 확인하는 방법입니다.

final String captchaResponse = request.getParameter("h-captcha-response");

StringBuilder sb = new StringBuilder();
sb.append("response=");
sb.append(captchaResponse);
sb.append("&secret=");
sb.append(secretKey);

HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
ResponseEntity<String> res = restTemplate.postForEntity("https://hcaptcha.com/siteverify", new HttpEntity<>(sb.toString(), header), String.class);

log.debug("http response status: " + res.getStatusCode().name());
log.debug("body: " + res.getBody());

 

응답 값은 오류가 발생하고 200으로 리턴됩니다.

{
   "success": true|false,     // is the passcode valid, and does it meet security criteria you specified, e.g. sitekey?
   "challenge_ts": timestamp, // timestamp of the challenge (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
   "hostname": string,        // the hostname of the site where the challenge was solved
   "credit": true|false,      // optional: whether the response will be credited
   "error-codes": [...]       // optional: any error codes
   "score": float,            // ENTERPRISE feature: a score denoting malicious activity.
   "score_reason": [...]      // ENTERPRISE feature: reason(s) for score.
}

(에러코드 확인 : https://docs.hcaptcha.com/#siteverify-error-codes-table )

 

성공일 경우 응답

{
  "success":true,
  "challenge_ts":"2022-03-21 19:21:20.0",
  "hostname":"localhost"
}

 

실패일 경우 응답

{
  "success":false,
  "error-codes":["missing-input-secret"]
}

 

 

 

[Reference]

https://docs.hcaptcha.com/

https://golb.hplar.ch/2020/05/hcaptcha.html

728x90
반응형

댓글