๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Front-End

์ธ์ฆ(Authentication)

by ์ฝ”๋”ฉํ•˜๋Š” ๋ถ•์–ด 2021. 11. 18.
๋ฐ˜์‘ํ˜•

๐Ÿ‘ ์ธ์ฆ(Authentication)

์œ ์ €(User)์˜ identification์„ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ. ์ฆ‰, ์œ ์ €์˜ ์•„์ด๋””์™€ ๋น„๋ฒˆ์„ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ์ด๋‹ค.

 

 

๐Ÿ’ ๋กœ๊ทธ์ธ ์ ˆ์ฐจ

  1. User ์•„์ด๋””์™€ ๋น„๋ฒˆ ์ƒ์„ฑ.
  2. User์˜ ๋น„๋ฒˆ์„ ์•”ํ˜ธํ™” ํ•ด์„œ DB์— ์ €์žฅ.
  3. User๊ฐ€ ๋กœ๊ทธ์ธ -> ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ
  4. User๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™” ํ•œ ํ›„ ์•”ํ˜ธํ™”๋˜์„œ DB์— ์ €์ •๋œ ์œ ์ € ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋น„๊ตํ•จ.
  5. ์ผ์น˜ํ•˜๋ฉด ๋กœ๊ทธ์ธ ์„ฑ๊ณต!
  6. ๋กœ๊ทธ์ธ ์„ฑ๊ณตํ•˜๋ฉด access token์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†ก.
  7. User๋Š” ๋กœ๊ทธ์ธ ์„ฑ๊ณตํ•œ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” access token์„ ์ฒจ๋ถ€ํ•ด์„œ request๋ฅผ ์„œ๋ฒ„์— ์ „์†กํ•จ์œผ๋กœ์„œ ๋งค๋ฒˆ ๋กœ๊ทธ์ธ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ ํ•œ๋‹ค.



๐Ÿ’ ์œ ์ € ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”

โ—๏ธ ์œ ์ €์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์ ˆ๋Œ€ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ทธ๋Œ€๋กœ DB์— ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค!

  • DB๊ฐ€ ํ•ดํ‚น์„ ๋‹นํ•˜๋ฉด ์œ ์ €์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋„ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋œ๋‹ค.
  • ์™ธ๋ถ€ ํ•ดํ‚น์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋‚ด๋ถ€ ๊ฐœ๋ฐœ์ž๋‚˜ ์ธ๋ ฅ์ด ์œ ์ €๋“ค์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

โ—๏ธ ์œ ์ €์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๊ผญ ์•”ํ˜ธํ™” ํ•ด์„œ ์ €์žฅ ํ•ด์•ผ ํ•œ๋‹ค!

  • ์•”ํ˜ธํ™” ํ•ด์„œ ์ €์žฅํ•˜๋ฉด DB๊ฐ€ ํ•ดํ‚น์„ ๋‹นํ•ด๋„ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋‚ด๋ถ€ ์ธ๋ ฅ๋„ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค.

โ—๏ธ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธ์—๋Š” ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜(one-way hash function)๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ์ธ๋‹ค!

  • ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ์›๋ณธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์•”ํ˜ธํ™”๋œ ๋ฉ”์‹œ์ง€์ธ ๋‹ค์ด์ œ์ŠคํŠธ(digest)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์›๋ณธ ๋ฉ”์‹œ์ง€๋ฅผ ์•Œ๋ฉด ์•”ํ˜ธํ™”๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌํ•˜๊ธฐ๋Š” ์‰ฝ์ง€๋งŒ, ์•”ํ˜ธํ™”๋œ ๋ฉ”์‹œ์ง€๋กœ๋Š” ์›๋ณธ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†์–ด์„œ ๋‹จ๋ฐฉํ–ฅ์„ฑ(one-way) ์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, "test password"๋ฅผ hash256์ด๋ผ๋Š” ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.
  • ๋งŒ์ผ "test password2"๋ฅผ hash256์ด๋ผ๋Š” ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb ๊ฐ’์ด ๋‚˜์˜จ๋‹ค. ์‹ค์ œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ ํ•ด์‹œ ํ•จ์ˆ˜ ๊ฐ’์€ ์™„์ „ํžˆ ํ‹€๋ฆฐ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ํšจ๊ณผ๋ฅผ avalance๋ผ๊ณ  ํ•˜๋Š”๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹œ ๊ฐ’์„ ํ•ดํ‚นํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ํ•˜๋‚˜์˜ ์š”์†Œ์ด๋‹ค.
  • ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ๋‹จ์ 
    ๋ ˆ์ธ๋ณด์šฐ ๊ณต๊ฒฉ
    ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ณต๊ฒฉ



๐Ÿ‘ ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ๋ณด์™„์ 

๐Ÿ’ Salting

์‹ค์ œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ด์™ธ์— ์ถ”๊ฐ€์ ์œผ๋กœ ๋žœ๋ค ๋ฐ์ดํ„ฐ๋ฅผ ๋”ํ•ด์„œ ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•.

๐Ÿ’ Key Stretching

๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•œ ํ›„ ๊ทธ ํ•ด์‹œ๊ฐ’์„ ๋˜ ํ•ด์‹œํ•˜๊ณ , ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

  • ์ตœ๊ทผ์—๋Š” ์ผ๋ฐ˜์ ์ธ ์žฅ๋น„๋กœ 1์ดˆ์— 50์–ต ๊ฐœ ์ด์ƒ์˜ ๋‹ค์ด์ œ์ŠคํŠธ๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ‚ค ์ŠคํŠธ๋ ˆ์นญ์„ ์ ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์žฅ๋น„์—์„œ 1์ดˆ์— 5๋ฒˆ ์ •๋„๋งŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. GPU(Graphics Processing Unit)๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ˆ˜๋ฐฑ์—์„œ ์ˆ˜์ฒœ ๋ฒˆ ์ •๋„๋งŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค. 50์–ต ๋ฒˆ๊ณผ๋Š” ๋น„๊ตํ•  ์ˆ˜๋„ ์—†์„ ์ •๋„๋กœ ์ ์€ ํšŸ์ˆ˜๋‹ค. ์•ž์œผ๋กœ ์ปดํ“จํ„ฐ ์„ฑ๋Šฅ์ด ๋” ํ–ฅ์ƒ๋˜๋ฉด ๋ช‡ ๋ฒˆ์˜ ๋ฐ˜๋ณต์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ Bcrypt

DB์— ์œ ์ €์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋•Œ, ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์ด ์•”ํ˜ธํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” password hashing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.

  • Salting & Key Stretching ๋Œ€ํ‘œ์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
  • ์ฒ˜์Œ๋ถ€ํ„ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™” ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ•ด์‹œ ํ•จ์ˆ˜.
  • ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•˜์—ฌ ์‰ฝ๊ฒŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • bcrypt ํ•ด์‹œ ๊ฒฐ๊ณผ๊ฐ’์— ์†Œ๊ธˆ๊ฐ’๊ณผ ํ•ด์‹œ๊ฐ’ ๋ฐ ๋ฐ˜๋ณตํšŸ์ˆ˜๋ฅผ ๊ฐ™์ด ๋ณด๊ด€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— DB ์„ค๊ณ„๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๐Ÿ’ JWT(JSON Web Tokens)

์œ ์ € ์ •๋ณด๋ฅผ ๋‹ด์€ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™” ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์— ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ.

  • access token์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ ์ค‘ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ JWT์ด๋‹ค.
  • ์ˆ˜๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ง€์›์ด ๋จ.
  • ์ž๊ฐ€ ์ˆ˜์šฉ์ . ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.
  • ๋‘ ๊ฐœ์ฒด ์‚ฌ์ด์—์„œ ์†์‰ฝ๊ฒŒ ์ „๋‹ฌ ๊ฐ€๋Šฅ.
๋ฐ˜์‘ํ˜•

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

Refactoring(๋ฆฌํŒฉํ† ๋ง)  (0) 2021.11.21
Frontend Framework(Library)  (0) 2021.11.21
์ธ๊ฐ€(Authorization)  (0) 2021.11.18
Self Refactoring Tip  (0) 2021.11.17
RESTful API ๋ž€?  (0) 2021.11.15

๋Œ“๊ธ€