๐๏ธ React์ react-google-recaptcha ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ ReCaptcha V2, V3 ๋ฌธ์์ ๋๋ค.
![]() |
![]() |
---|
โจ ๐๏ธ React์ react-google-recaptcha ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ ReCaptcha V2, V3 ๋ฌธ์์ ๋๋ค. โจ
- React ์์ฑ
npm create-react-app my-app
# or
yarn create react-app my-app
- vite๋ฅผ ์ด์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ค๋ฉด
npm create vite@latest
# or
yarn create vite
- ํฐ๋ฏธ๋์์ ์คํ ํ ํ๋ก์ ํธ ์ด๋ฆ ๋ง๋ ํ React ์ ํ, Typescirpt-SWC ์ ํํ๋ฉด ์์ฑ ์๋ฃ.
ReCaptcha
๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ฌ๋์ธ์ง ๋ก๋ด์ธ์ง๋ฅผ ์๊ณ ์ถ๋ค๋ฉดReCaptcha
๋ฅผ React์์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋react-google-recaptcha
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ ์งํํด์ผ ํ๋ค. ๊ทธ๋ผ, ์๋ ๋ช ๋ น์ด๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ค.
$ npm install react-google-recaptcha-v3 react-google-recaptcha
# or
$ yarn add react-google-recaptcha-v3 react-google-recaptcha
.env
ํ์ผ์๋ReCaptcha
์ฌ์ดํธ์์ ๋ฐ๊ธ๋ฐ์ 2๊ฐ์งkey
๊ฐ์ ๋ฃ์ด์ผ ํ๋ค.- ์ด์ ๋ํ ์ธ๋ถ ์ฌํญ์ ๋งํฌ๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋ฐ๋๋ค.
VITE_V2_KEY={ReCaptcha 2๋ฒ์ ์ key ๊ฐ}
VITE_V3_KEY={ReCaptcha 3๋ฒ์ ์ key ๊ฐ}
Captcha2.tsx
,Captcha3.tsx
๋ฅผimport
ํ์ฌdiv.card
์์ ์์น์ํจ๋ค.
import { useState } from 'react'
import reactLogo from './assets/react.svg'
import ReCaptcha from './assets/ReCaptcha.png'
import './App.css'
import Captcha2 from '@components/Captcha2'
import Captcha3 from '@components/Captcha3'
export default function App(): JSX.Element {
return (
<div className="App">
<div>
<a href="https://www.npmjs.com/package/react-google-recaptcha" target="_blank">
<img src={ReCaptcha} className="logo" alt="ReCaptcha" />
</a>
<a href="https://reactjs.org" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
</div>
<h1>React-ReCaptcha-Pages</h1>
<div className="card">
<Captcha2 />
<Captcha3 />
</div>
<p className="read-the-docs">
Click on the React and ReCaptcha logos to learn more
</p>
</div>
)
}
ReCaptcha
์ 2๋ฒ์ ผ ์ค ์ด๋ฏธ์ง ์ ํ ํ์์ ๊ณ ๋ฅธ ํimport.meta.env.VITE_V2_KEY
๋ก.env
์ key ๊ฐ์ ํตํด ์๋์ํจ๋ค.
import React from "react";
import ReCAPTCHA from "react-google-recaptcha";
const Captcha2 = () => {
const recaptchaRef = React.useRef() as React.MutableRefObject<HTMLFormElement>;
const onSubmitWithReCAPTCHA = async () => {
const token = await recaptchaRef.current.executeAsync();
}
return (
<form onSubmit={onSubmitWithReCAPTCHA}>
<ReCAPTCHA
ref={recaptchaRef}
sitekey={import.meta.env.VITE_V2_KEY}
/>
</form>
)
}
export default Captcha2
ReCaptcha
์ 3๋ฒ์ ผ์ ์ฌ์ฉ์๊ฐ ์๋์ผ๋ก ์ฌ๋์ธ์ง ๊ธฐ๊ณ์ธ์ง๋ฅผ ํ๋จํด์ค๋ค.- ์์์ ์์ฑํ ๋ด์ฉ๊ณผ ๋์ผํ๊ฒ
import.meta.env.VITE_V3_KEY
๋.env
์ key ๊ฐ์ ํตํด ์๋์ํฌ ์ ์๋ค.
import React from "react";
import ReCAPTCHA from "react-google-recaptcha";
const Captcha3 = () => {
const recaptchaRef = React.useRef() as React.MutableRefObject<HTMLFormElement>;
const onSubmitWithReCAPTCHA = async () => {
const token = await recaptchaRef.current.executeAsync();
}
return (
<form onSubmit={onSubmitWithReCAPTCHA}>
<ReCAPTCHA
ref={recaptchaRef}
size="invisible"
sitekey={import.meta.env.VITE_V3_KEY}
/>
</form>
)
}
export default Captcha3