๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ ์ผ์ง€ ๐Ÿ‘ฉ‍๐Ÿ’ป

HTML onclick ์†์„ฑ์—์„œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

by chuyj15 2025. 4. 29.
728x90
๋ฐ˜์‘ํ˜•
SMALL

์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด onclick ์†์„ฑ์—์„œ JavaScript ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด ๊ณผ์ •์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ์ข…์ข… ๋งŒ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:

  • Uncaught SyntaxError: Unexpected identifier 'Object'
  • Uncaught SyntaxError: Unexpected token 'J'

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์™€, ์ด๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๋ฌธ์ œ ์ƒํ™ฉ

์•„๋ž˜์™€ ๊ฐ™์ด HTML ๋ฒ„ํŠผ์— ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋„˜๊ธฐ๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

 
<button onclick="openProductPopup({name: 'apple'})">ํด๋ฆญ</button>

 

๊ฒฐ๊ณผ:Uncaught SyntaxErrorUnexpected identifier 'Object'

 

์™œ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๊นŒ์š”?


๋ฌธ์ œ์˜ ์›์ธ

HTML ์†์„ฑ๊ฐ’์€ ํ•ญ์ƒ ๋ฌธ์ž์—ด๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

  • HTML์€ {} ๊ฐ™์€ JavaScript ๊ฐ์ฒด ํ‘œํ˜„์‹์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • HTML์—์„œ๋Š” ์†์„ฑ ๊ฐ’ ์ „์ฒด๊ฐ€ ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด๋กœ ์ฝํžˆ๊ธฐ ๋•Œ๋ฌธ์— {}๋‚˜ JavaScript ํ‚ค์›Œ๋“œ๋Š” ๊ตฌ๋ฌธ ์˜ค๋ฅ˜(SyntaxError)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์ฆ‰, ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋„˜๊ธฐ๋ ค๊ณ  ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ํŒŒ์‹ฑํ•  ์ˆ˜ ์—†์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.


์˜ฌ๋ฐ”๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ํ•ต์‹ฌ์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค:

  1. HTML ์ž‘์„ฑ ์‹œ: ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‚ฝ์ž…ํ•ด์•ผ ํ•œ๋‹ค.
  2. JavaScript ํ•จ์ˆ˜ ๋‚ด: ๋‹ค์‹œ JSON.parse() ํ•ด์„œ ๊ฐ์ฒด๋กœ ๋ณต์›ํ•ด์•ผ ํ•œ๋‹ค.

1. ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

HTML ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ JSON.stringify()๋ฅผ ์‹ค์ œ ๋ฐ์ดํ„ฐ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

// ๋ฐฉ๋ฒ•1
var innerHTML = `<button onclick='openProductPopup(${JSON.stringify(product)})'>ํด๋ฆญ</button>`

// ๋งŒ์•ฝ ๋ฐฉ๋ฒ•1์—์„œ ํฐ๋”ฐ์˜ดํ‘œ๋‚˜ ์ž‘์€๋”ฐ์˜ดํ‘œ ๋•Œ๋ฌธ์— ์•ˆ๋˜๋ฉด ๋ฐฉ๋ฒ•2
var innerHTML = `<button class="product-btn" 
	onclick="openProductPopup('${JSON.stringify(product).replace(/"/g, '&quot;').replace(/'/g, '&#39;')}')">ํด๋ฆญ</button>`
$('#productList').append(innerHTML);
// replace ํ•œ ์ด์œ  : HTML์šฉ ์ด์Šค์ผ€์ดํ”„์ฒ˜๋ฆฌํ•œ๊ฒƒ
// .replace(/"/g, '&quot;') // ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ &quot; (HTML ์—”ํ‹ฐํ‹ฐ)
// .replace(/'/g, '&#39;')  // ์ž‘์€๋”ฐ์˜ดํ‘œ๋ฅผ &#39; (HTML ์—”ํ‹ฐํ‹ฐ)
  • ์ด๋•Œ ${JSON.stringify(product)}๋Š” ์˜ˆ๋ฅผ ๋“ค๋ฉดํ˜•ํƒœ์˜ JSON ๋ฌธ์ž์—ด๋กœ ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค.
  • {"name":"apple","price":1000}

2. JavaScript ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

openProductPopup ํ•จ์ˆ˜์—์„œ๋Š” ๋ฌธ์ž์—ด๋กœ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ JSON.parse()๋กœ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

function openProductPopup(productData) { 
    const product = JSON.parse(productData); 
    console.log(product.name); // "apple" 
}

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด HTML์—์„œ๋Š” ๋ฌธ์ž์—ด์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฃผ๊ณ ๋ฐ›๊ณ , JavaScript์—์„œ๋Š” ๊ฐ์ฒด์ฒ˜๋Ÿผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ณด๋„ˆ์Šค: ๋” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ• (์ถ”์ฒœ)

HTML ์†์„ฑ์—์„œ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š” ๋Œ€์‹ , data- ์†์„ฑ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

<button data-product='{"name":"apple","price":1000}' onclick="openProductPopup(this)"> ํด๋ฆญ </button>


// var html = `<button class="product-btn" data-product='${JSON.stringify(product)}' onclick="openProductPopup(this)">ํด๋ฆญ</button>`
// $('#productList').append(html);
 
function openProductPopup(buttonElement) { 
	const product = JSON.parse(buttonElement.dataset.product);
	console.log(product.name); // "apple" 
    
    // jQuery
    // var data = $(button).data('product');
    // ์ œ์ด์ฟผ๋ฆฌ์˜ data๋ฉ”์†Œ๋“œ๋Š” ์ž๋™์œผ๋กœ JSON.parseํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋˜ JSON.parseํ•˜๋ฉด ์—๋Ÿฌ๋‚จ
}
 

์žฅ์ :

  • ์ฝ”๋“œ๊ฐ€ ๋” ๊น”๋”ํ•ด์ง‘๋‹ˆ๋‹ค.
  • XSS(๊ต์ฐจ ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…) ์ทจ์•ฝ์„ฑ๋„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HTML๊ณผ JavaScript ๋กœ์ง์„ ๋” ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌ

ํ•ญ๋ชฉ์„ค๋ช…
HTML ์†์„ฑ์€ ๋ฌธ์ž์—ด๋งŒ ๊ฐ€๋Šฅ {} ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋„˜๊ธธ ์ˆ˜ ์—†์Œ
๊ฐ์ฒด๋ฅผ ๋„˜๊ธฐ๋ ค๋ฉด JSON.stringify()๋กœ ๋ฌธ์ž์—ดํ™”
๋‹ค์‹œ ๊ฐ์ฒด๋กœ ์“ฐ๋ ค๋ฉด JSON.parse()๋กœ ๋ณต๊ตฌ
๋” ์ข‹์€ ๋ฐฉ๋ฒ• data- ์†์„ฑ ์‚ฌ์šฉ ์ถ”์ฒœ

๋งˆ์น˜๋ฉฐ

onclick ์†์„ฑ์—์„œ ๊ฐ์ฒด๋ฅผ ๋„˜๊ธธ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ์ž์ฃผ ๋งŒ๋‚ฉ๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธฐํšŒ์— ๊ตฌ์กฐ์™€ ์›๋ฆฌ๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ฉด,
์•ž์œผ๋กœ HTML๊ณผ JavaScript๋ฅผ ์„ž์–ด ์‚ฌ์šฉํ•  ๋•Œ ํ›จ์”ฌ ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ”ฅ ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ์‹œ๋‹ค!

 

 

https://m.blog.naver.com/chuyj15/223828976226

 

 

728x90
๋ฐ˜์‘ํ˜•
LIST