์ฝ”๋“œ ์ƒ์„ฑ ๋กœ์ง์— ์•”ํ˜ธํ™”๊ฐ€ ํ•„์š”ํ–ˆ๋˜ ์ด์œ 

์„œ๋น„์Šค์—์„œ ์‹๋ณ„ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๊ธฐ์กด์—๋Š” ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ PK(id) ๊ฐ’์„ ์ด์šฉํ•ด ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

(id๊ฐ€ 123์ด๋ฉด PRE0123๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ์‹)

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์—๋Š” ์น˜๋ช…์ ์ธ ๋‹จ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, id ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์™ธ๋ถ€์— ๋…ธ์ถœ๋œ๋‹ค๋Š” ์ ์ด๋‹ค.

์ด๋กœ ์ธํ•ด ์ „์ฒด ๋“ฑ๋ก ์ˆ˜ ์ถ”์ •, ์—ฐ์†๋œ id ์ถ”์  ๋“ฑ ๋ณด์•ˆ์ƒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ์— ์•”ํ˜ธํ™”๋ฅผ ์ ์šฉํ•˜์˜€๋‹ค.


1. ์ฒซ ๋ฒˆ์งธ ์‹œ๋„: XOR ์—ฐ์‚ฐ์„ ์ด์šฉํ•œ ์•”ํ˜ธํ™”

์ฒ˜์Œ์—๋Š” id ๊ฐ’์— ๋น„๋ฐ€ํ‚ค(SECRET_NUMBER)๋ฅผ XOR ์—ฐ์‚ฐํ•˜์—ฌ ์™ธ๋ถ€์—์„œ id๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์•Œ ์ˆ˜ ์—†๊ฒŒ ํ•˜๋Š” ๋ฐฉ์‹์„ ๋„์ž…ํ–ˆ๋‹ค.

const encoded = (id ^ SECRET_NUMBER).toString(36).toUpperCase().padStart(6, '0');

์ด ๋ฐฉ์‹์€ ์–ด๋А ์ •๋„ id ๋…ธ์ถœ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์—ฐ์†๋œ id(์˜ˆ: 145, 146 ๋“ฑ)๋Š” ์—ฌ์ „ํžˆ ๋น„์Šทํ•œ ํŒจํ„ด์˜ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์™„๋ฒฝํ•œ ์•”ํ˜ธํ™”๋ผ๊ณ  ๋ณด๊ธฐ ์–ด๋ ค์› ๋‹ค.


2. ๋‘ ๋ฒˆ์งธ ์‹œ๋„: ํ•ด์‹œ(hash) ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ์ƒ์„ฑ

๋” ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ์„ ์œ„ํ•ด Node.js์˜ crypto ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ SHA-256 ํ•ด์‹œ๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค.

  • id ๊ฐ’์„ ํ•ด์‹œ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ 
  • ํ•ด์‹œ๊ฐ’์˜ ์•ž 8์ž๋ฆฌ๋ฅผ ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ
  • ์˜ˆ์‹œ: PRE99160B2

์ด ๋ฐฉ์‹์€

  • id์™€ ์ฝ”๋“œ์˜ ์ง์ ‘์  ์—ฐ๊ด€์„ฑ์ด ์‚ฌ๋ผ์ง€๊ณ 
  • ์ค‘๋ณต ๊ฐ€๋Šฅ์„ฑ๋„ ๊ทนํžˆ ๋‚ฎ์•„์ ธ ์‹ค์งˆ์ ์œผ๋กœ ์•ˆ์ „ํ•œ ์ฝ”๋“œ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

3. ์„ธ ๋ฒˆ์งธ ์‹œ๋„: salt ์ ์šฉ์œผ๋กœ ๋ณด์•ˆ ๊ฐ•ํ™”

์—ฌ๊ธฐ์„œ ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€, salt(๋น„๋ฐ€ ๋ฌธ์ž์—ด)๋ฅผ ์ถ”๊ฐ€๋กœ ํ•ด์‹œ ์ž…๋ ฅ๊ฐ’์— ํฌํ•จ์‹œ์ผฐ๋‹ค.

const hash = crypto
  .createHash('sha256')
  .update(`${kind}-${id}-${SALT}`)
  .digest('hex')
  .toUpperCase();
const codeBody = hash.slice(0, 8);
return kindToPrefix[kind] + codeBody;
  • salt๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ฐ™์€ id์—ฌ๋„ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , salt๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ ์•ˆ์ „ํ•œ ๊ณณ์— ๋ณด๊ด€ํ•ด ์™ธ๋ถ€ ๋…ธ์ถœ์„ ๋ฐฉ์ง€ํ–ˆ๋‹ค.