์ฝ๋ ์์ฑ ๋ก์ง์ ์ํธํ๊ฐ ํ์ํ๋ ์ด์
์๋น์ค์์ ์๋ณ ์ฝ๋๋ฅผ ์์ฑํ ๋, ๊ธฐ์กด์๋ ๋จ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ 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๋ ํ๊ฒฝ๋ณ์ ๋ฑ ์์ ํ ๊ณณ์ ๋ณด๊ดํด ์ธ๋ถ ๋ ธ์ถ์ ๋ฐฉ์งํ๋ค.