[250423] TIL
Today I Learned (2025-04-23)
์ธ์ฆ ๋๋ฉ์ธ ๊ตฌํ TIL
์ค๋ ๋ฐฐ์ด ๊ฒ
์นด์นด์ค ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์ ์ค๊ณํ๊ณ ๋ํ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ํ์ตํ์ต๋๋ค.
์ธ์ฆ ํ๋ฆ
- ์จ๋ณด๋ฉ โ ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ
- ์นด์นด์ค ์ธ์ฆ โ ์ฝ๋ฐฑ์ผ๋ก ์ธ์ฆ ์ฝ๋ ํ๋
- ์ฝ๊ด ๋์ โ ์๋น์ค/๊ฐ์ธ์ ๋ณด/์์น์ ๋ณด ๋์
- ํ๋กํ ์ค์ โ ๋๋ค์, ์๊ฐ๊ธ ์ ๋ ฅ
- ํ ํ๋ฉด ์ง์
์ฃผ์ ๊ตฌํ ์ฌํญ
1. KakaoLoginButton
const handleLogin = async () => {
const { redirect_url } = await AUTH_API.authorize();
window.location.href = redirect_url;
};
2. ์ธ์ฆ ์ฝ๋ฐฑ ์ฒ๋ฆฌ (SSR)
// /auth/callback
export const getServerSideProps = async ({ query }) => {
const { code } = query;
// ์ฝ๋๋ก ํ ํฐ ๋ฐ๊ธ ํ ๋ฆฌ๋ค์ด๋ ํธ
const { token } = await AUTH_API.getToken(code);
return { redirect: { destination: '/auth/consent' } };
};
3. ์ฝ๊ด ๋์ ํ์ด์ง (CSR)
// ConsentForm ํต์ฌ ๋ก์ง
const handleSubmit = async () => {
if (!allRequiredAgreed) return;
await AUTH_API.consent({ privacy: true, location: true });
router.push('/auth/signup');
};
4. ํ์๊ฐ์ ์ ๋ณด ์ ๋ ฅ (CSR)
// SignupForm ํต์ฌ ๋ก์ง
const onSubmit = async (data) => {
const profileUrl = data.profileImage
? await uploadImage(data.profileImage)
: null;
await AUTH_API.completeSignup({
nickname: data.nickname,
introduction: data.bio,
profile_image: profileUrl
});
router.push('/');
};
๊ธฐ์ ์ ๊ณ ๋ ค์ฌํญ
- ๋ ๋๋ง ์ ๋ต: ์ธ์ฆ ์ฝ๋ฐฑ์ SSR, ์ฌ์ฉ์ ์ธํฐ๋์ ์ด ๋ง์ ํ์ด์ง๋ CSR ์ฌ์ฉ
- ํ ํฐ ๊ด๋ฆฌ: HttpOnly ์ฟ ํค๋ก ์์ ํ๊ฒ ๋ณด๊ด
- ์ปดํฌ๋ํธ ์ค๊ณ: ์ฌ์ฌ์ฉ์ฑ ๊ณ ๋ คํ ๋ชจ๋ํ (LoadingSpinner, ConsentForm ๋ฑ)
- ์ ํจ์ฑ ๊ฒ์ฆ: React Hook Form์ผ๋ก ์ฌ์ฉ์ ์ ๋ ฅ ๊ฒ์ฆ
Leave a comment