Skip to content

yougahee/auth-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

60 Commits
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ” Authorization Server


๐Ÿ“Œ ์‚ฌ์šฉ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๊ธฐ์ˆ 

  • Spring Boot
  • JWT ( JSON Web Token)
  • Google SMTP
  • JPA
  • DB : MySQL, Redis


๐Ÿ”‘ ๊ตฌํ˜„์š”์†Œ(FLOW)


๐Ÿ“Œ ํšŒ์›๊ฐ€์ž…


  1. ์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•˜๊ณ  ์ธ์ฆ๋ฒˆํ˜ธ ๋ฐ›๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ๋‹ค.
    1. ํ•ด๋‹น ์ด๋ฉ”์ผ์ด ์„œ๋น„์Šค์— ์กด์žฌํ•œ๋‹ค๋ฉด ์ด๋ฉ”์ผ์ด ์ค‘๋ณต๋˜์—ˆ๋‹ค๋Š” ์‘๋‹ต๋ฉ”์„ธ์ง€๊ฐ€ ๊ฐ„๋‹ค.
  2. ์ธ์ฆ๋ฒˆํ˜ธ ๋ฐ›๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ์ด๋ฉ”์ผ๋กœ ์ธ์ฆ๋ฒˆํ˜ธ๊ฐ€ ์ „์†ก๋œ๋‹ค. (์ „์†ก๋ฐ›์€ ์ธ์ฆ์ฝ”๋“œ๋ฅผ 10๋ถ„์•ˆ์— ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.)
    1. ์ธ์ฆ๋ฒˆํ˜ธ๊ฐ€ ์ž˜ ์ž…๋ ฅ๋˜์—ˆ๋‹ค๋ฉด, ๋‹ค์Œ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
    2. ์ธ์ฆ๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
    3. ์ธ์ฆ๋ฒˆํ˜ธ์ „์†ก์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ–ˆ๋‹ค๋ฉด, ๋งจ ๋งˆ์ง€๋ง‰์œผ๋กœ ์˜จ ๋ฉ”์ผ(์ตœ์‹  ๋ฉ”์ผ)์˜ ์ธ์ฆ๋ฒˆํ˜ธ๋กœ ์ž…๋ ฅํ•ด์•ผํ•œ๋‹ค.
  3. ๋‹‰๋„ค์ž„๊ณผ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ํšŒ์›๊ฐ€์ž…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    1. ๋‹‰๋„ค์ž„์€ ์ค‘๋ณต๋˜์ง€ ์•Š์•„์•ผํ•˜๋ฉฐ ์ค‘๋ณตํ™•์ธ ๋ฒ„ํŠผ์œผ๋กœ ์ฒดํฌํ•œ๋‹ค.
    2. ํŒจ์Šค์›Œ๋“œ๋Š” 8~20์ž ์‚ฌ์ด์˜ ๋ฌธ์ž๋กœ ์˜์–ด, ์ˆซ์ž, ํŠน์ˆ˜๋ฌธ์ž ์กฐํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.
  4. ์ •์ƒ์ ์œผ๋กœ ํšŒ์›๊ฐ€์ž…์ด ๋œ๋‹ค.

๐Ÿ“Œ ๋กœ๊ทธ์ธ


  1. ์ด๋ฉ”์ผ ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํ›„ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ๋‹ค.
    1. ํšŒ์›์ด๋ผ๋ฉด ๋กœ๊ทธ์ธ์ด ๋˜๊ณ  ๋ฉ”์ธํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
    2. ํšŒ์›์ด ์•„๋‹ˆ๋ผ๋ฉด ๋กœ๊ทธ์ธ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
    3. ๋กœ๊ทธ์ธ์‹œ AccessToken๊ณผ RefreshToken์„ ์‘๋‹ต์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

๐Ÿ“Œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ


  1. ์ž„์‹œ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐœ๊ธ‰

๐Ÿ“Œ ๋งˆ์ดํŽ˜์ด์ง€


  1. ๋งˆ์ดํŽ˜์ด์ง€์— ๋“ค์–ด์˜ค๋ฉด ๋‹‰๋„ค์ž„, ํฌ์ธํŠธ, ๋‚ด๊ฐ€ ํŒ”๋กœ์šฐํ•œ ์‚ฌ๋žŒ๋“ค์˜ ๋ชฉ๋ก์ด ๋œฌ๋‹ค.
  2. ํฌ์ธํŠธ๋ฅผ ์ถฉ์ „ํ•  ์ˆ˜ ์žˆ๋‹ค.
    1. ์ŠคํŠธ๋ฆฌ๋ฐ ์ค‘์— ํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ๊ทธ์™ธ


  1. Refresh Token ๋ฐœ๊ธ‰
  2. ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ, ๋ณ€๊ฒฝ
  3. ๋‹‰๋„ค์ž„ ์ค‘๋ณต์ฒดํฌ, ๋ณ€๊ฒฝ
  4. ํšŒ์›์ •๋ณด ์ˆ˜์ •, ํƒˆํ‡ด
  5. ํฌ์ธํŠธ update
  6. admin ์„œ๋น„์Šค


๐Ÿ”‘ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ๊ณ ๋ฏผํ–ˆ๋˜ ๊ฒƒ๋“ค


  1. ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์‘๋‹ต ๋˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์‘๋‹ตํ•ด์ฃผ๋Š” ์ผ์ข…์˜ ์„œ๋น„์Šค์ง์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
    ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”์„ธ์ง€์™€ ์ ์ ˆํ•œ ์‘๋‹ต๊ฐ’์„ ์ค˜์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด, ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋‹ค๊ฐ€ ์—๋Ÿฌ๊ฐ€ ๋‚œ ๊ฒฝ์šฐ๋ผ๋ฉด ์–ด๋–ค ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋Š”์ง€ ๋ฌด์Šจ ๋ฌธ์ œ์ธ์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค.
    ์ด๋Ÿฐ ์ƒ๊ฐ๋“ค๋กœ ์ดˆ๋ฐ˜์— ์–ด๋–ป๊ฒŒ exception ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋‹ค.

    • ControllerAdvice๋ผ๋Š” ๊ฒƒ์ด ์žˆ์—ˆ๋‹ค.
  2. ์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค์—์„œ ์™œ ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…์ด ํ•„์š”ํ•œ๊ฐ€?

    • ์ฑ„ํŒ…์„ ์น˜๊ธฐ ์œ„ํ•ด
    • ์ถ”ํ›„ ๊ฐœ๋ฐœ๋  ํŒ”๋กœ์šฐ, ํŒ”๋กœ์ž‰์„ ํ†ตํ•ด ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์ŠคํŠธ๋ฆฌ๋จธ์˜ ๋ฐฉ์†ก์„ ์†์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐฉ์†ก์„ ๋ณด๋Š” ์ค‘์— ํฌ์ธํŠธ๋กœ ๋ฐฉ์†ก์„ ํ›„์›ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์–ด๋–ค ๋ฐฉ์†ก์„ ์ฃผ๋กœ ๋ณด๋Š” ์ง€ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“์„ ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ์™œ PW, salt์˜ ๊ธธ์ด๋ฅผ VARCHAR(100)์œผ๋กœ ์žก์•˜๋‚˜?

  4. id๋ฅผ DB์— ์ €์žฅํ•  ๋•Œ, ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ• ์ง€ ์•ˆํ•  ๊ฒƒ์ธ์ง€ ์ •ํ•ด์•ผํ•œ๋‹ค.

    • ๊ตฌ๋ถ„์„ ์•ˆํ•˜๋Š” ์„œ๋น„์Šค๋„ ์žˆ์ง€๋งŒ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ(๋„ค์ด๋ฒ„, ์นด์นด์˜ค, ๊ตฌ๊ธ€ ๋“ฑ)์€ ์ด๋ฉ”์ผ์˜ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค.
      ID๋Š” ๋Œ€/์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  DB์— ์ €์žฅํ•  ๋•Œ ํ•ญ์ƒ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค.
  5. Spring Data Redis์—์„œ Redis์— ์ ‘๊ทผํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค.

    • ์ฒซ์งธ๋Š” RedisTemplate๋ฐฉ์‹, ๋‘๋ฒˆ์งธ๋Š” Redis Repository๋ฐฉ์‹.
  6. ๋งŒ์•ฝ, refresh token๋„ ๊ฐˆ์ทจ๋ฅผ ๋‹นํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜?

    • refresh token๋„ ์ƒˆ๋กœ ๋ฐœ๊ธ‰์€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋กœ์ปฌ์— ๋‹ด๊ฒจ์žˆ๋‹ค๋Š” ์ , header ๋˜๋Š” body์— ๋‹ด๊ฒจ์„œ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์ง„๋‹ค๋Š” ์ ์„ ๋‘๊ณ  ๋ดค์„ ๋•Œ, ๊ฐˆ์ทจ๋ฅผ ๋‹นํ–ˆ์„ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด์•ผํ•œ๋‹ค.
    • ์š”์ฒญํ•˜๋Š” IP ์ฃผ์†Œ๋‚˜ ๋‹ค๋ฅธ ์ •๋ณด๋“ค์„ ํ•จ๊ป˜ ์ €์žฅํ•ด๋‘์–ด refresh token์„ ์ƒˆ๋กœ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค๋˜๊ฐ€ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.
    • access token์ด ๋งŒ๋ฃŒ๋˜์„œ refresh token์„ ๋ณด๋‚ด๋Š” ๊ณผ์ •์ด ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜์—ฌ DB์— ์ €์žฅํ•ด๋†“์€ refresh token์„ ์–ด๋–ป๊ฒŒ ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?
      • ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ๋Œ€๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ์†๋„์™€ ์„ฑ๋Šฅ์ด ๋А๋ ค์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๊ฝค ์ปค๋ณด์ธ๋‹ค.
  7. ์œ ์ € ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ–ˆ๋‚˜?

    • ์‹ค์ œ ๊ตฌํ˜„
      • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ์„ ํ•  ๋•Œ, ๋ฌธ์ž, ์ˆซ์ž, ํŠน์ˆ˜๋ฌธ์ž ์กฐํ•ฉ์œผ๋กœ ์ž…๋ ฅ
      • salt ์‚ฌ์šฉ ( ๊ณ ์œ ํ•œ salt๊ฐ’์„ ๊ฐ€์ ธ์•ผํ•˜๊ณ  32๋ฐ”์ดํŠธ ์ด์ƒ์ด์–ด์•ผ ํ•œ๋‹ค.)
      • SHA256 ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™” ์‚ฌ์šฉ
    • ์ถ”ํ›„ ๋ฐœ์ „ ๋ฐฉ์•ˆ
      • ํ•œ ์žฅ๋น„์—์„œ 1์ดˆ์— 5๋ฒˆ ์ •๋„๋งŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. (์›๋ž˜๋Š” ์•ฝ 50์–ต๋ฒˆ์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•œ๋‹ค. ๋ฌด๋ถ„๋ณ„ํ•œ ํ•ดํ‚น์˜ ์œ„ํ—˜์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ)
  8. token์€ Header? Body? Cookie? ์–ด๋А ๊ณณ์œผ๋กœ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ์ด ๋งž์„๊นŒ?

    • Header๋‚˜ Cookie์— ํฌํ•จ์‹œ์ผœ์„œ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ํ•œ๋‹ค.
    • ์ฒ˜์Œ์—” Response Body์— ๋ณด๋‚ด์ค˜๋„ ๊ดœ์ฐฎ์ง€ ์•Š์„๊นŒ? ์ƒ๊ฐํ–ˆ๋‹ค. Header ๋˜๋Š” Body์— ๋„ฃ๋˜ ํ‹€๋ฆฐ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ "์ผ๋ฐ˜์ "์œผ๋กœ๋Š” Header์— ์‚ฌ์šฉ
  9. token์„ response header์— ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ์ด์œ 

    • jwt๋ผ๋Š” ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์ƒ body์— ๋‹ด๊ธฐ๋Š” data๋ž‘ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จ
      • ํ•ด๋‹น ํŽ˜์ด์ง€๋„ header์— ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์ถ”์ฒœ ํ•˜๊ณ  ์žˆ๋‹ค.
      • CSRF, XSS ํ•ดํ‚น ์œ„ํ—˜ ๊ฐ์†Œ
      • CSRF
  10. Log ๊ด€๋ฆฌ

    • ์š”์ฒญ์— ๋Œ€ํ•œ Request, Response ์ •๋ณด๋“ค์€ Fileter๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด 200 ๋˜๋Š” 400 ์—๋Ÿฌ ๋“ฑ ์–ด๋А ๊ณณ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ณ  ์„ฑ๊ณต์ด ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ๋‹ค.
      ์ข€ ๋” ๊ณ ๋ฏผํ•ด ๋ณผ๋งŒํ•œ ์ƒํ™ฉ


๐Ÿ”‘ API ๋ฌธ์„œ

  • swagger ์‚ฌ์šฉํ•ด๋ณด๊ธฐ
  • ์‚ฌ๋‚ด ์œ„ํ‚ค์— UpLoad


๐Ÿ”‘ ์ธ์ฆ

๐Ÿ“Œ JWT(JSON Web Token)

  • header, payload, signature๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.
  • token, refresh token


๐Ÿ“Œ ์‚ฌ์šฉ์ž ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™”๋ฐฉ๋ฒ•

  1. PBKDF2
  2. bcrypt
    • ํŒจ์Šค์›Œ๋“œ ์ €์žฅ์„ ๋ชฉ์ ์œผ๋กœ ์„ค๊ณ„
    • OpenBSD์—์„œ ๊ธฐ๋ณธ ์•”ํ˜ธ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์‚ฌ์šฉ
    • ์ž…๋ ฅ ๊ฐ’์œผ๋กœ 72byte character ์ œ์•ฝ


๐Ÿ“Œ Token์ด ํ•„์š”ํ•œ ์ด์œ ?

  • Access Token์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋งˆ์ดํŽ˜์ด์ง€์— ์ ‘๊ทผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด๋ฉด, '๋‚˜'๋ผ๋Š” ๊ฒƒ์ด ์ฆ๋ช…๋˜์–ด์•ผ ํ•œ๋‹ค.
  • '๋‚˜'๋ผ๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์„๊นŒ?
    • ์ฆ๋ช…์ด ํ•„์š”ํ•œ ์š”์ฒญ๋งˆ๋‹ค ๋กœ๊ทธ์ธ์„ ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.
    • ํ•˜์ง€๋งŒ, ๋งค๋ฒˆ ๋กœ๊ทธ์ธ์„ ํ•ด์„œ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด๋‚˜ ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ๋กœ๊ทธ์ธ์„ ํ–ˆ์„ ๋•Œ, token์„ ๋ฐœ๊ธ‰๋ฐ›์•„์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ token('๋‚˜'๋ฅผ ์ฆ๋ช…ํ•ด์ค„ ์ฆ๋ช…์„œ)์„ ์ €์žฅํ•˜์—ฌ ์ธ์ฆ์ด ํ•„์š”ํ•œ ์š”์ฒญ header์— ํ•จ๊ป˜ ๋ณด๋‚ธ๋‹ค.


๐Ÿ“Œ ๊ทธ๋ ‡๋‹ค๋ฉด RefreshToken์€ ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์‚ฌ์ด์—์„œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ, Token์„ ํ™œ์šฉํ•˜๋Š”๋ฐ, HTTP๋กœ ๋ณด๋‚ด์ง€๋Š” ๊ณผ์ •์—์„œ ๊ฐˆ์ทจ๋ฅผ ๋‹นํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Access Token์˜ ์œ ์ง€์‹œ๊ฐ„์„ ์งง๊ฒŒ ์ฃผ๊ณ  Refresh Token์„ ์‚ฌ์šฉํ•œ๋‹ค.


๐Ÿ“Œ ๊ตฌํ˜„ํ•œ ๋ฐฉ๋ฒ•

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ–ˆ์„ ๋•Œ, access token๊ณผ refresh token์„ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค.
    • access token์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„์€ 1์‹œ๊ฐ„, refresh token์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„์€ 1์ฃผ์ผ๋กœ ์„ค์ •ํ–ˆ๋‹ค.
  2. ๋กœ๊ทธ์ธ์„ ํ•œ ์œ ์ €๋Š” header์— token์„ ๋‹ด์•„์„œ ๋ณธ์ธ์ž„์„ ์ธ์ฆํ•œ๋‹ค.
  3. ๋งŒ์•ฝ, token์ด ๋งŒ๋ฃŒ๊ฐ€ ๋œ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ๋Š” ๋งŒ๋ฃŒ๋œ ํ† ํฐ์ด๋ผ๋Š” ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.
  4. ํด๋ผ์ด์–ธํŠธ์—์„œ refresh token์„ ๋ณด๋‚ด๊ณ  ์ž์‹ ์ž„์„ ์ฆ๋ช…ํ•˜๊ณ  ์„œ๋ฒ„๋Š” ๋‹ค์‹œ access token๊ณผ refresh token์„ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค.



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

  • SHA-256
  • salt
  • BCryptPasswordEncoder

๐Ÿ“Œ BCryptPasswordEncoder?


  • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜
  • ์•”ํ˜ธํ™”์‹œํ‚ฌ text + salt๋ฅผ ๋”ํ•˜์—ฌ digest๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ“Œ ๊ทธ์™ธ

  1. PBKDF2(Password-Based Key Derivation Function)
  2. scrypt

๐Ÿ“Œ SHA-256์ด๋ž€?

  • Secure Hash Algorithm์˜ ์•ฝ์ž๋กœ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๐Ÿ“Œ MD5๋ž€?

  • MD5(Message-Digest algorithm 5)๋Š” 128๋น„ํŠธ ์•”ํ˜ธํ™” ํ•ด์‹œ ํ•จ์ˆ˜์ด๋‹ค.
  • ์‹ฌํ•œ ์•”ํ˜ธํ™” ๊ฒฐํ•จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ๊ด€๋ จ ์šฉ๋„๋กœ๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉฐ ๋ณดํ†ต ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ํŒŒ์ผ์ด ์›๋ณธ ๊ทธ๋Œ€๋กœ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์‚ฌ๋“ฑ์— ํ™œ์šฉ๋œ๋‹ค.

๐Ÿ“Œ ๋Œ€๋ถ€๋ถ„ SHA-256์„ ๋” ์‚ฌ์šฉํ•˜๊ณ  MD5๋Š” ์“ฐ๋Š” ๊ฒƒ์„ ์ž˜ ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š”?


  • ํ˜„์žฌ MD5 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณด์•ˆ ๊ด€๋ จ ์šฉ๋„๋กœ ์“ฐ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉฐ, ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ( SSL ์ธ์ฆ์„œ๋ฅผ ๋ณ€์กฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ฐœํ‘œ๋˜์—ˆ๋‹ค. )

๐Ÿ”‘ Error Log

  1. BCrypto๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด dependecies์— implementation 'org.springframework.boot:spring-boot-starter-security' ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
    • ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  POSTMAN์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋‹ˆ spring security๊ฐ€ ์ƒ๊ฒจ์„œ 401 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , web์œผ๋กœ url์„ ์ž…๋ ฅํ•ด๋ณด๋‹ˆ, ๋กœ๊ทธ์ธ์„ ํ•˜๋ผ๋Š” ์ฐฝ์ด ๋‚˜์™”๋‹ค.
    • ์›์ธ : ์ถ”๊ฐ€ํ•œ dependency๋Š” spring security๋ฅผ ํ™œ์„ฑํ™”์‹œ์ผœ์ฃผ์—ˆ๋‹ค.
    • ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : implementation 'org.springframework.security:spring-security-crypto:5.1.5.RELEASE' ๋Œ€์ฒด

  1. E-mail ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ JavaMailSender๊ฐ€ ๊ณ„์†ํ•ด์„œ NULL๊ฐ’์ด ๋“ค์–ด์™”๋‹ค.
    • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, @AutoWired๋ฅผ ์ผ๋”๋‹ˆ ์ˆœํ™˜ํ˜ธ์ถœ๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ„ฐ์ ธ์„œ ์ปดํ“จํ„ฐ๊ฐ€ ๋‹ค์šด๋๋‹ค.
    • @RequiredArgsConstructor ์„ ์‚ฌ์šฉํ•˜์ž!
      • ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…์ด ๋  ๋Œ€์ƒ์„ private final๋กœ ์ ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  1. properties์—์„œ gmail๋กœ ๋ฉ”์ผ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ์„ค์ •๋„ ๋‹ค ํ•ด๋†“์•˜๊ณ , JavaMailSender์—๋„ NULL๊ฐ’์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๊ฒƒ๋„ ํ™•์ธํ–ˆ๋Š”๋ฐ, MailSendException์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค.
    • ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‹ˆ SSL, SSLHandShakeException, certification๋“ฑ ๋ณด์•ˆ๊ด€๋ จํ•œ ์šฉ์–ด๋“ค์ด ๋‚˜์™”๋‹ค.
    • ๊ตฌ๊ธ€๋ง ๋์— ๋ณด์•ˆ ํ”„๋กœ๊ทธ๋žจ์„ ๋„๊ณ  ๋Œ๋ ค๋ณด๋‹ˆ ๋ฉ”์ผ์ด ์ž˜ ์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๐Ÿ“‚ ERD

๐Ÿƒโ€โ™‚๏ธ user

Column type ์„ค๋ช… PK/FK
user_idx BIGINT ์œ ์ € ๊ณ ์œ ๊ฐ’ ( ์ž๋™ ์ƒ์„ฑ ) PK
email VARCHAR(255) user ID(์ด๋ฉ”์ผํ˜•์‹)
pwd VARCHAR(255) user ๋น„๋ฐ€๋ฒˆํ˜ธ
salt VARCHAR(255) user ๋น„๋ฐ€๋ฒˆํ˜ธ Salt
nickname VARCHAR(255) ๋‹‰๋„ค์ž„
grade TINYINT ์œ ์ €์ƒํƒœ Default 0
point BIGINT ํฌ์ธํŠธ Default 50000
create_dt DATETIME ์ƒ์„ฑ๋‚ ์งœ
login_dt DATETIME ๋กœ๊ทธ์ธํ•œ ์‹œ๊ฐ„
update_dt DATETIME updateํ•œ ์‹œ๊ฐ„


๐Ÿ‘Š follow

Column type ์„ค๋ช… PK/FK
follow_idx BIGINT FK
user_follow_idx BIGINT FK
user_streamer_idx BIGINT FK
create_dt DATETIME ์ƒ์„ฑ๋‚ ์งœ


๐Ÿšช streaming_room

Column type ์„ค๋ช… PK/FK
room_idx BIGINT ๋ฐฉ ๊ณ ์œ ๊ฐ’ ( ์ž๋™ ์ƒ์„ฑ ) PK
user_idx BIGINT ์ŠคํŠธ๋ฆฌ๋จธ๊ณ ์œ ๊ฐ’
title VARCHAR(255) ๋ฐฉ์ œ๋ชฉ
thumnail_location VARCHAR(1000) ์ธ๋„ค์ผ์ €์žฅ๊ฒฝ๋กœ
video_location VARCHAR(1000) ์˜์ƒ์ €์žฅ๊ฒฝ๋กœ
created_dt DATETIME ๋ฐฉ์†ก์‹œ์ž‘๋‚ ์งœ NOT NULL
end_stream_dt DATETIME ๋ฐฉ์†ก์ข…๋ฃŒ๋‚ ์งœ


user์˜ grade์ •๋ณด

Number ์„ค๋ช…
0 ์ด๋ฉ”์ผ ์ธ์ฆํ•˜๊ธฐ ์ „
1 ํšŒ์›๊ฐ€์ž…์™„๋ฃŒ(์ผ๋ฐ˜ํšŒ์›)
3 ์ด๋ฉ”์ผ ์ธ์ฆ์„ ํ•œ ํšŒ์›
5 ๊ด€๋ฆฌ์ž
9 ํƒˆํ‡ดํ•œ ํšŒ์›


๐Ÿ”‘ dependencies

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-devtools'

	//db
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'mysql:mysql-connector-java'

	//redis
	implementation 'org.springframework.boot:spring-boot-starter-data-redis'

	//lombok
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	implementation 'org.springframework.boot:spring-boot-starter-test'

	//encryption
	implementation 'org.springframework.security:spring-security-crypto:5.1.5.RELEASE'

	//valid
	implementation 'org.springframework.boot:spring-boot-starter-validation:2.3.3.RELEASE'

	//jwt
	implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.7.0'
	implementation 'com.auth0:java-jwt:3.4.0'

	//email
	implementation 'org.springframework.boot:spring-boot-starter-mail'
	//compile "com.sun.mail:javax.mail"
	//implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

	// Swagger 2
	compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
	compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
}


About

๐Ÿ”Authorization Server

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages