Jieunny์˜ ๋ธ”๋กœ๊ทธ

S3) Unit 7. [Backend] Cookie / Session ๋ณธ๋ฌธ

CodeStates/learning contents

S3) Unit 7. [Backend] Cookie / Session

Jieunny 2023. 3. 7. 14:11

๐Ÿ“ฃ  Cookie

โœ”๏ธ ์–ด๋–ค ์›น ์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ”์„ ๋•Œ, ์„œ๋ฒ„๊ฐ€ ์ผ๋ฐฉ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ

โœ”๏ธ ์„œ๋ฒ„๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ

โžฐ ํ•ด๋‹น ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ฟ ๊ธฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด, ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ๋„๋ฉ”์ธ์—๊ฒŒ http ์š”์ฒญ ์‹œ ์ฟ ํ‚ค๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•œ๋‹ค.

โžฐ ๋‹จ์ˆœํžˆ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์— ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒƒ๋งŒ ์˜๋ฏธํ•˜์ง€ ์•Š๊ณ , ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์ฟ ํ‚ค๋ฅผ ๋‹ค์‹œ ์ „์†กํ•˜๋Š” ๊ฒƒ๋„ ํฌํ•จํ•œ๋‹ค.

๐Ÿ“ฃ  Cookie ํŠน์ง•

โœ”๏ธ ์žฅ์‹œ๊ฐ„ ๋ณด์กดํ•ด์•ผํ•˜๋Š” ์ •๋ณด ์ €์žฅ์— ์ ํ•ฉํ•˜๋‹ค.

โžฐ ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€

 

โœ”๏ธ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ํŠน์ • ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

โžฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ์ดํ›„ ์•„๋ฌด ๋•Œ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋Š” ์—†๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ์ดํ›„ ํŠน์ • ์กฐ๊ฑด๋“ค์ด ๋งŒ์กฑ๋˜์–ด์•ผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

โžฐ ์ด๋Ÿฐ ์กฐ๊ฑด๋“ค์€ http ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฟ ํ‚ค ์˜ต์…˜์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“ฃ  ์ฟ ํ‚ค ์˜ต์…˜

'Set-Cookie':[
            'cookie=yummy', 
            'Secure=Secure; Secure',
            'HttpOnly=HttpOnly; HttpOnly',
            'Path=Path; Path=/cookie',
            'Doamin=Domain; Domain=codestates.com'
        ]

1๏ธโƒฃ Domain

โœ”๏ธ ๋„๋ฉ”์ธ : ์„œ๋ฒ„์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„

โžฐ ์ฟ ํ‚ค ์˜ต์…˜์—์„œ ๋„๋ฉ”์ธ์€ 'http://www.localhost.com:3000/users/login' ์—์„œ 'localhost.com' ๋ถ€๋ถ„์ด๋‹ค.

โžฐ ์ฟ ํ‚ค ์˜ต์…˜์— ๋„๋ฉ”์ธ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด, ํด๋ผ์ด์–ธํŠธ๋Š” ์ฟ ํ‚ค์˜ ๋„๋ฉ”์ธ ์˜ต์…˜๊ณผ ์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•ด์•ผ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2๏ธโƒฃ Path

โœ”๏ธ Path : ์„œ๋ฒ„๊ฐ€ ๋ผ์šฐํŒ…ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋กœ

โžฐ ์š”์ฒญํ•ด์•ผํ•˜๋Š” url์ด 'http://www.localhost.com:3000/users/login' ๋ผ๋ฉด 'path๋Š” /users/login' ์ด๋‹ค.

โžฐ ์„ค์ •๋œ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•˜๋Š” ํ•˜์œ„ ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์„ ํ•˜๋”๋ผ๋„ ์ฟ ํ‚ค๋ฅผ ์„œ๋ฒ„์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๏น’ path๊ฐ€ /users๊ณ , ์š”์ฒญ ๊ฒฝ๋กœ๊ฐ€ /users/codestates์ธ ๊ฒฝ์šฐ ์ฟ ๊ธฐ ์ „์†ก์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

3๏ธโƒฃ MaxAge or Expires

โœ”๏ธ ์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•œ ๊ธฐ๊ฐ„์„ ์ •ํ•˜๋Š” ์˜ต์…˜

โžฐ MaxAge : ์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•œ ์‹œ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜

โžฐ Expires : ์–ธ์ œ๊นŒ์ง€ ์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•œ์ง€ ํด๋ผ์ด์–ธํŠธ์˜ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์‹œ๊ฐ„, ๋‚ ์งœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

โžฐ ์œ„ ์˜ต์…˜ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์„ธ์…˜ ์ฟ ํ‚ค, ์˜์†์„ฑ ์ฟ ํ‚ค๋กœ ๋‚˜๋‰œ๋‹ค.

    ๏น’ ์„ธ์…˜ ์ฟ ํ‚ค : MaxAge ๋˜๋Š” Expires ์˜ต์…˜์ด ์—†๋Š” ์ฟ ํ‚ค๋กœ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹คํ–‰ ์ค‘์ผ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์‹œ ์ฟ ํ‚ค์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ํ•ด๋‹น ์ฟ ํ‚ค๋Š” ์‚ญ์ œ๋œ๋‹ค.

    ๏น’ ์˜์†์„ฑ ์ฟ ํ‚ค : ๋ธŒ๋ผ์šฐ์ €์˜ ์ข…๋ฃŒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด MaxAge ๋˜๋Š” Expires์˜ ์œ ํšจ์‹œ๊ฐ„๋งŒํผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

 

4๏ธโƒฃ Secure

โœ”๏ธ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ฅธ ์ฟ ๊ธฐ์˜ ์ „์†ก ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์˜ต์…˜

โžฐ true์ธ ๊ฒฝ์šฐ HTTPS๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

โžฐ ๋„๋ฉ”์ธ์ด localhost์ธ ๊ฒฝ์šฐ์—๋Š” HTTPS๊ฐ€ ์•„๋‹ˆ์–ด๋„ ์ฟ ํ‚ค ์ „์†ก์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

5๏ธโƒฃ HttpOnly

โœ”๏ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

โžฐ true์ธ ๊ฒฝ์šฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ฟ ํ‚ค์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

โžฐ ๋””ํดํŠธ๊ฐ’์€ false๋กœ, document.cookie๋กœ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฟ ํ‚ค๊ฐ€ ํƒˆ์ทจ๋  ์œ„ํ—˜์ด ์žˆ๋‹ค.

 

6๏ธโƒฃ SameSite

โœ”๏ธ Cross-Origin ์š”์ฒญ์„ ๋ฐ›์€ ๊ฒฝ์šฐ, ์š”์ฒญ์—์„œ ์‚ฌ์šฉํ•œ ๋ฉ”์„œ๋“œ(GET, POST...)์™€ ํ•ด๋‹น ์˜ต์…˜์˜ ์กฐํ•ฉ์„ ๊ธฐ์ค€์œผ๋กœ ์„œ๋ฒ„์˜ ์ฟ ํ‚ค ์ „์†ก ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

โžฐ Lax : Cross-Origin ์š”์ฒญ์ด๋ผ๋ฉด GET ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

โžฐ Strict : ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ์˜ต์…˜์œผ๋กœ, Cross-Origin์ด ์•„๋‹Œ same-site์ธ ๊ฒฝ์šฐ์—๋งŒ ์ „์†ก ๊ฐ€๋Šฅํ•˜๋‹ค.

โžฐ None : ๊ฐ€์žฅ ๊ด€๋Œ€ํ•œ ์˜ต์…˜์œผ๋กœ, ํ•ญ์ƒ ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ฟ ํ‚ค ์˜ต์…˜ ์ค‘ Secure ์˜ต์…˜์ด ํ•„์š”ํ•˜๋‹ค.

 

๐Ÿ“ฃ  Cookie๋ฅผ ์ด์šฉํ•œ ์ƒํƒœ ์œ ์ง€

โœ”๏ธ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์— ์ธ์ฆ์ •๋ณด๋ฅผ ๋‹ด์€ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ์ „๋‹ฌ๋ฐ›์€ ์ฟ ํ‚ค๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ „์†กํ•˜์—ฌ Statelessํ•œ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์„ Statefuleํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ”๏ธ ํ•˜์ง€๋งŒ ์ธ์ฆ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ๊ณต๊ฒฉ์ž๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ํƒˆ์ทจ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ์œ„ํ—˜ํ•˜๋ฏ€๋กœ, ์ฟ ํ‚ค์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๊ฒƒ์€ ์œ„ํ—˜ํ•˜๋‹ค.


๐Ÿ“ฃ  Session

โœ”๏ธ ์„ธ์…˜ : ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์œ ์ผํ•˜๊ณ  ์•”ํ˜ธํ™”๋œ ID๋ฅผ ๋ถ€์—ฌ

โœ”๏ธ ์ค‘์š” ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌ

 

๐Ÿ“ฃ  Session ์ „๋‹ฌ ๋ฐฉ๋ฒ•

1๏ธโƒฃ ๋กœ๊ทธ์ธ

โœ”๏ธ ์‚ฌ์šฉ์ž๊ฐ€ ์ •ํ™•ํ•œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์ธ์ฆ์— ์„ฑ๊ณต(์„ธ์…˜)ํ–ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ , ์œ ์ €๋Š” ๋งค๋ฒˆ ๋กœ๊ทธ์ธ ํ•  ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋œ๋‹ค.

โœ”๏ธ ์ด๋•Œ ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์— ์„ฑ๊ณตํ–ˆ์Œ์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ธ์ฆ ์„ฑ๊ณต์„ ์ฆ๋ช…ํ•  ์ˆ˜๋‹จ์„ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

1. ์„œ๋ฒ„๋Š” ์ผ์ข…์˜ ์ €์žฅ์†Œ(์ฃผ๋กœ in-memory)์— ์„ธ์…˜์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์„ธ์…˜ ์Šคํ† ์–ด์— ์ €์žฅํ•œ๋‹ค.

2. ์„ธ์…˜์ด ๋งŒ๋“ค์–ด์ง€๋ฉด, ๊ฐ ์„ธ์…˜์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ์…˜ ์•„์ด๋””๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š”๋ฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฅผ ์„ธ์…˜ ์„ฑ๊ณต์„ ์ฆ๋ช…ํ•  ์ˆ˜๋‹จ์œผ๋กœ์จ ์ „๋‹ฌํ•œ๋‹ค.

3. ์ด๋•Œ ์›น์‚ฌ์ดํŠธ์—์„œ ๋กœ๊ทธ์ธ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ฟ ํ‚ค๋Š” ์„œ๋ฒ„์—์„œ ๋ฐœ๊ธ‰ํ•œ ์„ธ์…˜ ์•„์ด๋””๋ฅผ ์ €์žฅํ•œ๋‹ค.

4. ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ์œ ํšจํ•œ ์„ธ์…˜ ์•„์ด๋””๊ฐ€ ์„œ๋ฒ„์— ์ „๋‹ฌ๋˜๊ณ , ์„ธ์…˜ ์Šคํ† ์–ด์— ํ•ด๋‹น ์„ธ์…˜์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์š”์ฒญ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

 

2๏ธโƒฃ ๋กœ๊ทธ์•„์›ƒ

โœ”๏ธ ํด๋ผ์ด์–ธํŠธ๋Š” ์„ธ์…˜ ์•„์ด๋””๊ฐ€ ๋‹ด๊ธด ์ฟ ํ‚ค๋ฅผ, ์„œ๋ฒ„๋Š” ์„ธ์…˜์„ ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์„œ๋ฒ„๋Š” ๊ทธ์ € ์„ธ์…˜ ์•„์ด๋””๋กœ๋งŒ ์ธ์ฆ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.

โœ”๏ธ ๋กœ๊ทธ์•„์›ƒ์€ ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์‚ญ์ œํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ์ฟ ํ‚ค๋ฅผ ๊ฐฑ์‹ ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค.

โžฐ ํด๋ผ์ด์–ธํŠธ๋Š” res.cookie๋กœ ์ฟ ํ‚ค์˜ ๊ฐ’์„ ๋ฌดํšจํ•œ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•˜๊ฑฐ๋‚˜, res.clearCookie๋กœ ์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“ฃ  Session์˜ ๋‹จ์ 

โœ”๏ธ ์„œ๋ฒ„ ์ €์žฅ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋ฏ€๋กœ ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ์˜ ์–‘์ด ์ค„์–ด๋“ ๋‹ค.

โœ”๏ธ ์„ธ์…˜ ์ฟ ํ‚ค๊ฐ€ ํƒˆ์ทจ๋œ๋‹ค๋ฉด ์—ฌ์ „ํžˆ ๊ฐœ์ธ์ •๋ณด๊ฐ€ ์œ ์ถœ๋  ์œ„ํ—˜์ด ์žˆ๋‹ค.

 

๐Ÿ“ฃ  Cookie vs Session

๐Ÿ“ฃ  express-session

โœ”๏ธ  ์„ธ์…˜์„ ๋Œ€์‹  ๊ด€๋ฆฌํ•ด ์ฃผ๋Š” Node.js์˜ ๋ชจ๋“ˆ

โžฐ ์„ธ์…˜์„ ์œ„ํ•œ ๋ฏธ๋“ค์›จ์–ด๋กœ, express ์„œ๋ฒ„์—์„œ ์‰ฝ๊ฒŒ ์„ธ์…˜์„ ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ค€๋‹ค.

const express = require('express');
const session = require('express-session');

const app = express();

app.use(
  session({
  // ์„ธ์…˜์˜ ์˜ต์…˜์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  // ์„ธ์…˜ ๊ฐ์ฒด๋Š” ์œ ์ €๋ณ„๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์ด๋ฏ€๋กœ ์œ ์ €๋ณ„๋กœ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    secret: '@codestates',
    // ๋น„๋ฐ€ํ‚ค๋ฅผ ์ด์šฉํ•ด ์•”ํ˜ธํ™”ํ•ด์„œ ์„ธ์…˜id๋ผ๋Š” ๊ฒƒ์„ ์ƒ์„ฑํ•œ๋‹ค.
    // ์ด๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ฟ ํ‚ค๋กœ ์ „์†กํ•œ๋‹ค.
    resave: false,
    saveUninitialized: true,
    cookie: {
      domain: 'localhost',
      path: '/',
      maxAge: 24 * 6 * 60 * 10000,
      sameSite: 'none',
      httpOnly: false,
      secure: true,
    },
  })
);

โžฐ ํด๋ผ์ด์–ธํŠธ์— ์œ ์ €์˜ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ๋‹ด์ง€ ์•Š๊ณ ๋„ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์„ธ์…˜ id๋ฅผ ์ด์šฉํ•ด ์œ ์ €์˜ ์ธ์ฆ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.