์ค‘ํ•™์ƒ๋„ ์ดํ•ดํ•˜๋Š” CSRF

2025. 11. 20. 18:15ยทWEB

๐Ÿ›ก๏ธ CSRF (Cross-Site Request Forgery) ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ

CSRF๋Š” ํ•ด์ปค๊ฐ€ '๋‚˜์ธ ์ฒ™' ๊ฐ€์žฅํ•ด์„œ ์›น์‚ฌ์ดํŠธ์— ์ด์ƒํ•œ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์‰ฝ๊ฒŒ ๋งํ•ด, ๋‚ด๊ฐ€ ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์„ ์•…์šฉํ•ด ๋‚ด๊ฐ€ ์›ํ•˜์ง€ ์•Š์€ ํ–‰๋™(๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ๊ฒฐ์ œ, ๊ธ€ ์ž‘์„ฑ ๋“ฑ)์„ ๋‚˜๋„ ๋ชจ๋ฅด๊ฒŒ ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๐ŸŽก 1. ์‰ฌ์šด ๋น„์œ : ๋†€์ด๊ณต์› ์ž์œ ์ด์šฉ๊ถŒ ์‚ฌ๊ฑด

์ด ์ƒํ™ฉ์„ '๋†€์ด๊ณต์›'์— ๋น„์œ ํ•˜๋ฉด ์•„์ฃผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘  ๋กœ๊ทธ์ธ (์ž์œ ์ด์šฉ๊ถŒ ๋ฐœ๊ธ‰)

์—ฌ๋Ÿฌ๋ถ„์ด ๋†€์ด๊ณต์›์—์„œ ์†๋ชฉ์— '์ž์œ ์ด์šฉ๊ถŒ ๋ฐด๋“œ'๋ฅผ ์ฐผ์Šต๋‹ˆ๋‹ค.

  • ์ด ๋ฐด๋“œ๋งŒ ๋ณด์—ฌ์ฃผ๋ฉด ๋งค์ ์—์„œ ๋ฐฅ์„ ์™ธ์ƒ์œผ๋กœ ๋จน์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • (์ธํ„ฐ๋„ท ์ƒํ™ฉ): ์›น์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธํ•ด์„œ '์ฟ ํ‚ค/์„ธ์…˜'์„ ๋ฐ›์€ ์ƒํƒœ

โ‘ก ํ•จ์ • (์‚ฌ๊ธฐ๊พผ์˜ ๋“ฑ์žฅ)

๋ฒค์น˜์—์„œ ์‰ฌ๊ณ  ์žˆ๋Š”๋ฐ, ๋‚ฏ์„  ์‚ฌ๋žŒ์ด ๋‹ค๊ฐ€์™€ "์ด ์ƒ์ž ์•ˆ์— ๋ญ๊ฐ€ ์žˆ๋Š”์ง€ ๊ตฌ๊ฒฝ๋งŒ ํ•ด๋ณผ๋ž˜?"๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • (์ธํ„ฐ๋„ท ์ƒํ™ฉ): ํ•ด์ปค๊ฐ€ ๋ณด๋‚ธ ์ด๋ฉ”์ผ์ด๋‚˜ ๋งํฌ๋ฅผ ํด๋ฆญ

โ‘ข ๊ณต๊ฒฉ (๊ฐ€์งœ ์ฃผ๋ฌธ)

์ƒ์ž๋ฅผ ์—ฌ๋Š” ์ˆœ๊ฐ„, ์ƒ์ž ๋ฐ”๋‹ฅ์— ์ˆจ๊ฒจ์ง„ ๋ฌด์ „๊ธฐ๊ฐ€ ๋งค์ ์— ์ฃผ๋ฌธ์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ป "์ง€๊ธˆ ์ด ๋ฐด๋“œ๋ฅผ ์ฐฌ ํ•™์ƒ ์•ž์œผ๋กœ ํ–„๋ฒ„๊ฑฐ 100๊ฐœ ์ฃผ๋ฌธ! ๊ฒฐ์ œ๋Š” ๋ฐด๋“œ๋กœ!"

โ‘ฃ ํ”ผํ•ด ๋ฐœ์ƒ

๋งค์  ์ง์›์€ ๋ฌด์ „๊ธฐ ์‹ ํ˜ธ์™€ ํ•จ๊ป˜ ์—ฌ๋Ÿฌ๋ถ„์˜ '์ž์œ ์ด์šฉ๊ถŒ ๋ฐด๋“œ'๊ฐ€ ํ™•์ธ๋˜๋‹ˆ, ์—ฌ๋Ÿฌ๋ถ„์ด ์ง์ ‘ ์ฃผ๋ฌธํ•œ ์ค„ ์•Œ๊ณ  ๊ฒฐ์ œํ•ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ CSRF์ž…๋‹ˆ๋‹ค.


๐Ÿ’ป 2. ์‹ค์ œ ์ธํ„ฐ๋„ท์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ผ์–ด๋‚ ๊นŒ์š”?

  1. ๋กœ๊ทธ์ธ ์ƒํƒœ: ์—ฌ๋Ÿฌ๋ถ„์ด ์€ํ–‰ ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ์„ ํ•ด๋‘ก๋‹ˆ๋‹ค. (๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋กœ๊ทธ์ธ ์ฆํ‘œ๋ฅผ ๊ธฐ์–ตํ•จ)
  2. ๋ฏธ๋ผ ํด๋ฆญ: ํ•ด์ปค๊ฐ€ ๋ณด๋‚ธ "๊ฒฝํ’ˆ ๋‹น์ฒจ" ๋งํฌ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ชฐ๋ž˜ ์ „์†ก: ํ•ด์ปค์˜ ์‚ฌ์ดํŠธ์—๋Š” ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š” ๋ช…๋ น์–ด๊ฐ€ ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

*"์€ํ–‰์•„, ์ง€๊ธˆ ์ ‘์†ํ•œ ์‚ฌ๋žŒ ๊ณ„์ขŒ์—์„œ ๋‚ด ๊ณ„์ขŒ๋กœ 100๋งŒ ์› ๋ณด๋‚ด์ค˜."*

  1. ์ž๋™ ์ธ์ฆ: ๋ธŒ๋ผ์šฐ์ €๋Š” ์€ํ–‰์œผ๋กœ ๋ช…๋ น์„ ๋ณด๋‚ผ ๋•Œ, ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๋กœ๊ทธ์ธ ์ฆํ‘œ(์ฟ ํ‚ค)๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ™์ด ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  2. ๊ณต๊ฒฉ ์„ฑ๊ณต: ์€ํ–‰์€ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด๋ผ ๋ฏฟ๊ณ  ๋ˆ์„ ์†ก๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ›ก๏ธ 3. ์–ด๋–ป๊ฒŒ ๋ง‰์„๊นŒ์š”? (๋ฐฉ์–ด๋ฒ•)

๊ฐœ๋ฐœ์ž๋“ค์€ ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด 'CSRF ํ† ํฐ'์ด๋ผ๋Š” ์ผํšŒ์šฉ ๋น„๋ฐ€ ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ์กด ๋ฐฉ์‹ (์œ„ํ—˜): "์ž์œ ์ด์šฉ๊ถŒ ๋ฐด๋“œ๋งŒ ๋ณด์—ฌ์ฃผ๋ฉด ํ†ต๊ณผ!"
  • ๋ฐฉ์–ด ๋ฐฉ์‹ (์•ˆ์ „): "์ž์œ ์ด์šฉ๊ถŒ ๋ฐด๋“œ์™€ ํ•จ๊ป˜, ์ง€๊ธˆ ํ™”๋ฉด์— ๋–  ์žˆ๋Š” ๋น„๋ฐ€ ์•”ํ˜ธ('๋ฐ”๋‚˜๋‚˜')๋ฅผ ๊ฐ™์ด ๋งํ•ด์•ผ ํ†ต๊ณผ!"

ํ•ด์ปค๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ๋กœ๊ทธ์ธ ์ƒํƒœ(๋ฐด๋“œ)๋Š” ๋ชฐ๋ž˜ ์ด์šฉํ•  ์ˆ˜ ์žˆ์–ด๋„, ์—ฌ๋Ÿฌ๋ถ„ ํ™”๋ฉด์—๋งŒ ๋–  ์žˆ๋Š” ์ˆœ๊ฐ„์˜ ๋น„๋ฐ€ ์•”ํ˜ธ(ํ† ํฐ)๋Š” ์•Œ ์ˆ˜ ์—†์–ด์„œ ๊ณต๊ฒฉ์— ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


โœ… ์š”์•ฝ

  • CSRF๋ž€? ๋‚ด ๋กœ๊ทธ์ธ ๊ถŒํ•œ์„ ๋„์šฉํ•ด ํ•ด์ปค๊ฐ€ ๋ชฐ๋ž˜ ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๊ณต๊ฒฉ.
  • ์›์ธ์€? ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋กœ๊ทธ์ธ ์ฆํ‘œ(์ฟ ํ‚ค)๋ฅผ ์ž๋™์œผ๋กœ ์ฒจ๋ถ€ํ•˜๋Š” ํŠน์„ฑ์„ ์•…์šฉํ•จ.
  • ํ•ด๊ฒฐ์ฑ…? CSRF ํ† ํฐ ๊ฐ™์€ ์ถ”๊ฐ€ ์ธ์ฆ ์ˆ˜๋‹จ์„ ์‚ฌ์šฉํ•ด ๋ฐฉ์–ดํ•จ.

์ด์ „ ๋‚ด์šฉ๊ณผ ์ด์–ด์ง€๋Š” ์‹ค์ „ ์ ์šฉ ํŽธ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋…์„ ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ์‹ค์ œ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ์— ๋ฐ”๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ› ๏ธ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ CSRF ๋ฐฉ์–ด ๊ฐ€์ด๋“œ (React/Next.js)

์•ž์„œ ์‚ดํŽด๋ณธ ๊ฐœ๋…์„ ์‹ค์ œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” 3๋‹จ๊ณ„ ๋ฐฉ์–ด ์ „๋žต์ž…๋‹ˆ๋‹ค. **1์ฐจ ๋ฐฉ์–ด์„ (์ฟ ํ‚ค ์„ค์ •)**๋งŒ ์ž˜ํ•ด๋„ ๋Œ€๋ถ€๋ถ„์˜ ๊ณต๊ฒฉ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, **2์ฐจ ๋ฐฉ์–ด์„ (ํ† ํฐ)**๊นŒ์ง€ ๊ตฌ์ถ•ํ•˜๋ฉด ๊ธˆ์œต๊ถŒ ์ˆ˜์ค€์˜ ๋ณด์•ˆ์„ ๊ฐ–์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿช 1. [ํ•„์ˆ˜] 1์ฐจ ๋ฐฉ์–ด์„ : SameSite ์ฟ ํ‚ค ์„ค์ •

๊ฐ€์žฅ ๊ฐ€์„ฑ๋น„๊ฐ€ ์ข‹๊ณ  ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ **"์ด ์ฟ ํ‚ค๋Š” ์šฐ๋ฆฌ ์‚ฌ์ดํŠธ์—์„œ๋งŒ ์จ!"**๋ผ๊ณ  ๊ฐ•์ œํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

Backend ์„ค์ • ์˜ˆ์‹œ (Node.js / Next.js API)

๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์ฟ ํ‚ค๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋Š” ์ฝ”๋“œ์— sameSite ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

// res.setHeader ๋˜๋Š” ์ฟ ํ‚ค ์„ค์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์‹œ
res.setHeader('Set-Cookie', serialize('auth_token', token, {
  httpOnly: true, // ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํƒˆ์ทจ ๋ถˆ๊ฐ€ (XSS ๋ฐฉ์–ด)
  secure: process.env.NODE_ENV === 'production', // HTTPS์—์„œ๋งŒ ์ „์†ก
  sameSite: 'lax', // โœ… ํ•ต์‹ฌ! (Lax ๋˜๋Š” Strict ์‚ฌ์šฉ)
  path: '/',
}));
  • Strict: ์˜ค์ง ๊ฐ™์€ ๋„๋ฉ”์ธ ๋‚ด์—์„œ๋งŒ ์ฟ ํ‚ค ์ „์†ก (๊ฐ€์žฅ ์•ˆ์ „ํ•˜์ง€๋งŒ, ์™ธ๋ถ€ ๋งํฌ ํƒ€๊ณ  ๋“ค์–ด์˜ฌ ๋•Œ ๋กœ๊ทธ์ธ ํ’€๋ฆด ์ˆ˜ ์žˆ์Œ)
  • Lax: ์•ˆ์ „ํ•œ ์ด๋™(๋งํฌ ํด๋ฆญ ๋“ฑ)์€ ํ—ˆ์šฉํ•˜๋˜, ๊ณต๊ฒฉ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์š”์ฒญ(POST, Form ์ „์†ก ๋“ฑ)์€ ์ฐจ๋‹จ. (๊ถŒ์žฅ)

๐Ÿ” 2. [๊ถŒ์žฅ] 2์ฐจ ๋ฐฉ์–ด์„ : CSRF Token (Double Submit Cookie)

์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ(๊ณ„์ • ์ˆ˜์ •, ๊ฒฐ์ œ)์ด ์ผ์–ด๋‚˜๋Š” ์„œ๋น„์Šค๋ผ๋ฉด ํ† ํฐ ๊ฒ€์ฆ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Frontend ๊ตฌํ˜„ ์˜ˆ์‹œ (React + Axios)

๋งค๋ฒˆ ์ˆ˜๋™์œผ๋กœ ํ† ํฐ์„ ๋„ฃ์ง€ ์•Š๊ณ , Axios Interceptor๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ์š”์ฒญ ํ—ค๋”์— ํ† ํฐ์„ ์ž๋™์œผ๋กœ ์‹ฌ์–ด์ค๋‹ˆ๋‹ค.

import axios from 'axios';

// 1. ์ฟ ํ‚ค์—์„œ CSRF ํ† ํฐ ๊ฐ’ ์ถ”์ถœ ํ•จ์ˆ˜
function getCookie(name) {
  const value = `; ${document.cookie}`;
  const parts = value.split(`; ${name}=`);
  if (parts.length === 2) return parts.pop().split(';').shift();
}

const api = axios.create({
  baseURL: '/api',
  withCredentials: true, // โœ… ์ฟ ํ‚ค(ํ† ํฐ)๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ ค๋ฉด ํ•„์ˆ˜ ์„ค์ •
});

// 2. ์š”์ฒญ ๊ฐ€๋กœ์ฑ„๊ธฐ (Interceptor)
api.interceptors.request.use((config) => {
  // ๋ณดํ†ต ์„œ๋ฒ„๊ฐ€ 'XSRF-TOKEN'์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ๋‚ด๋ ค์ค๋‹ˆ๋‹ค.
  const csrfToken = getCookie('XSRF-TOKEN'); 

  if (csrfToken) {
    // ํ—ค๋”์— ํ† ํฐ์„ ์‹ค์–ด ๋ณด๋ƒ…๋‹ˆ๋‹ค. (๋ฐฑ์—”๋“œ ์„ค์ •์— ๋”ฐ๋ผ ํ‚ค ์ด๋ฆ„ ํ™•์ธ ํ•„์š”)
    config.headers['X-XSRF-TOKEN'] = csrfToken; 
  }
  return config;
});

export default api;

๐Ÿš€ 3. [์ตœ์‹ ] Next.js ์‚ฌ์šฉ์ž๋ผ๋ฉด? (Server Actions)

Next.js App Router๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด ํ›จ์”ฌ ํŽธํ•ฉ๋‹ˆ๋‹ค. Server Actions๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Server Action ์˜ˆ์‹œ (์ž๋™ ๋ฐฉ์–ด)

๋ณ„๋„์˜ ํ† ํฐ ์„ค์ • ์—†์ด, ํผ ํƒœ๊ทธ์˜ action์— ์„œ๋ฒ„ ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Next.js๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์‹œ ID์™€ ์ถœ์ฒ˜(Origin)๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

// app/actions.ts (Server)
'use server'

export async function updateProfile(formData: FormData) {
  // ๐Ÿ›ก๏ธ Next.js๊ฐ€ ์ด๋ฏธ CSRF ๊ฒ€์ฆ์„ ๋งˆ์นœ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  const name = formData.get('name');
  await db.user.update({ where: { id: 1 }, data: { name } });
}
// app/page.tsx (Client)
'use client'
import { updateProfile } from './actions';

export default function Page() {
  return (
    <form action={updateProfile}>
      <input name="name" placeholder="์ƒˆ ์ด๋ฆ„ ์ž…๋ ฅ" />
      <button type="submit">์ €์žฅ</button>
    </form>
  );
}

๐Ÿ“ ์š”์•ฝ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  1. ๋ฐฑ์—”๋“œ: ์ฟ ํ‚ค ์˜ต์…˜์— SameSite: 'Lax'๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š”๊ฐ€?
  2. ํ”„๋ก ํŠธ์—”๋“œ: withCredentials: true ์„ค์ •์ด ๋˜์–ด ์žˆ๋Š”๊ฐ€?
  3. ํ”„๋ก ํŠธ์—”๋“œ: (ํ•„์š”์‹œ) ํ—ค๋”์— X-CSRF-TOKEN์„ ์‹ค์–ด ๋ณด๋‚ด๋Š”๊ฐ€?
๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'WEB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

CommonJS์™€ ESM์˜ ์ฐจ์ด์   (1) 2025.11.15
REST์™€ GraphQL ๋น„๊ต  (0) 2025.11.04
์ฟ ํ‚ค, ์„ธ์…˜(cookie, session)๊ณผ ํ† ํฐ (token, JWT)์˜ ์ฐจ์ด์   (0) 2022.04.19
REST API๋ž€?  (0) 2019.05.21
REST๋ž€?  (0) 2019.05.16
'WEB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • CommonJS์™€ ESM์˜ ์ฐจ์ด์ 
  • REST์™€ GraphQL ๋น„๊ต
  • ์ฟ ํ‚ค, ์„ธ์…˜(cookie, session)๊ณผ ํ† ํฐ (token, JWT)์˜ ์ฐจ์ด์ 
  • REST API๋ž€?
vitnal
vitnal
4๋…„์ฐจ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ž…๋‹ˆ๋‹ค. ์ด ๋ธ”๋กœ๊ทธ๋Š” ๊ธฐ๋กํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์ œ๋˜์ง€ ์•Š์€ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์  ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • vitnal
    vitnal ์•„์นด์ด๋ธŒ
    vitnal
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (154) N
      • What I Read (2)
      • AI (5) N
      • WEB (8)
      • React (21)
      • Nextjs (17)
      • JavaScript (16)
      • React Native (5)
      • Git (15)
      • Dev Tools (23)
      • Deploy (12)
      • Tech Memo (22)
      • Retrospect (7)
  • ๋ฐ˜์‘ํ˜•
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
vitnal
์ค‘ํ•™์ƒ๋„ ์ดํ•ดํ•˜๋Š” CSRF
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”