๐Ÿ”์ธ์ฆ/์ธ๊ฐ€ ์„œ๋ฒ„ - ์†Œ์…œ -> ์ผ๋ฐ˜์œผ๋กœ ์ „ํ–ฅํ•˜๊ธฐ(3)

์ดํ•˜์–€ยท2023๋…„ 2์›” 2์ผ
0

๐ŸŽฟ Smailegate(Winter-Devcamp)

๋ชฉ๋ก ๋ณด๊ธฐ
25/49
post-thumbnail

ํ”„๋กœ์ ํŠธ ์„ค๋ช… ๋ฐ ์„ค๊ณ„

๐Ÿงธ๊ธฐ๋ณธ ์„ค์ •

  • ์ด๋ฆ„ : AuthServer7
  • ๋ฒ„์ „ : SpringBoot 2.6.8 & JDK 11
  • ํŒจํ‚ค์ง€ : me.ver.Authserver7
  • ์˜์กด์„ฑ
- JPA
- Security
- Validation
- Web
- Redis
- Devtools
- Lombok
- MySQL
- Jsonwebtoken(api, impl, jackson)
- (ํ…Œ์ŠคํŠธ) Test, SecurityTest
  • DB ๊ด€๋ จ
    -> ํ™˜๊ฒฝ ๋ณ€์ˆ˜ : DB_PASSWORD, DB_URL, DB_USERNAME์œผ๋กœ ์„ค์ •
    -> DB ์ด๋ฆ„ : authserver7

๐Ÿงธ๋‚ด์šฉ ์ •๋ฆฌ

1. JWT

  • ํ† ํฐ ํ™•์ธ ๊ฐ€๋Šฅ ์‚ฌ์ดํŠธ(jwt.io)
  • Header + Payload + Signature
  • Header : Signature ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณด(alg : HS256)
  • Payload : ์„œ๋ฒ„ - ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์‹ค์ œ ์‚ฌ์šฉ ์ •๋ณด ์ €์žฅ(iss: ํ† ํฐ ๋ฐœ๊ธ‰์ž, exp : ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„)
  • Signature : ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋ฌธ์ž์—ด ์ €์žฅ(ํ—ค๋” + ํŽ˜์ด๋กœ๋“œ + ์‹œํฌ๋ฆฟ ํ‚ค ๊ตฌ์กฐ๋กœ ์ƒ์„ฑํ•œ๋‹ค -> ์‹œํฌ๋ฆฟ ํ‚ค๋Š” ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌํ•จ)

  • AccessToken & RefreshToken : ์—‘์„ธ์Šค ํ† ํฐ์˜ ์œ ํšจ์‹œ๊ฐ„ ์งง๊ฒŒ, ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ํ•จ๊ป˜ ๋ฐœ๊ธ‰
  • RefreshToken์˜ ์ €์žฅ : ์ด ํ† ํฐ์˜ ์ €์žฅ์€ MySQL ์‚ฌ์šฉ(๋ณดํ†ต์€ Redis์ž„)
  • ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ์€ MySQL๋งŒ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์›€ -> ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Redis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž„.

2. ํ๋ฆ„ ์ •๋ฆฌ(์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ๋ฐ˜๋“œ์‹œ ์ด๋ ‡๊ฒŒ ํ•œ๋‹ค๋ผ๊ณ  ๊ณ ์ •ํ•œ ๊ฒƒ์€ ์ ˆ๋Œ€ ์•„๋‹˜์„ ๋ฏธ๋ฆฌ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.)

<ํšŒ์›๊ฐ€์ž…>

  • Request : POST { email, password, username, nickname }
  • Response : { email, username, nickname, authorities(๊ถŒํ•œ) }
  • ์˜ˆ์‹œ

<๋กœ๊ทธ์ธ>
1. ๋กœ๊ทธ์ธ ์š”์ฒญ
2. DB ์ ‘๊ทผ & ์œ ์ € ํ™•์ธ(๊ฒ€์ฆ)
3. ํ† ํฐ ๋ฐœ๊ธ‰
4. ์‘๋‹ต

  1. ๋ฐ์ดํ„ฐ ์š”์ฒญ
  2. Access Token ์œ ํšจ์„ฑ ๊ฒ€์ฆ
  3. ์‘๋‹ต(์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋‚ด์šฉ)

[ ์•ก์„ธ์Šค ํ† ํฐ ๋งŒ๋ฃŒ์‹œ ]
1. ๋ฐ์ดํ„ฐ ์š”์ฒญ
2. ์—‘์„ธ์Šค ํ† ํฐ ๋งŒ๋ฃŒ ์—ฌ๋ถ€ ํ™•์ธ
3. ์‘๋‹ต
4. ์—‘์„ธ์Šค ํ† ํฐ ๋ฐœ๊ธ‰ ์š”์ฒญ
5. ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ํ†ตํ•ด ์œ ์ € ํ™•์ธ, ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ ๋ฐœ๊ธ‰
6. ์‘๋‹ต

  • Request : POST { email, password }
  • Response : { grantType, accesstoken, refreshtoken, accessTokenExpiresIn }
  • ์˜ˆ์‹œ

<๋กœ๊ทธ์•„์›ƒ>

  • Request : GET (์•ก์„ธ์Šค ํ† ํฐ์œผ๋กœ)
  • Response : ๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต / ์‹คํŒจ ์‹œ ๋‹ค์Œ ์ฒจ๋ถ€
  • ์˜ˆ์‹œ


<ํ† ํฐ ์žฌ๋ฐœ๊ธ‰>

  • Request : POST { accesstoken, refreshtoken }
  • Response : { grantType, accesstoken, refreshtoken, accessTokenExpiresIn }
  • ์˜ˆ์‹œ

<์ •๋ณด ์กฐํšŒ>

  • Request : GET (์—‘์„ธ์Šค ํ† ํฐ์œผ๋กœ)
  • Response : { email, username, nickname, authorites }

<์ •๋ณด ์ˆ˜์ •>

  • Request : PUT { nickname } + ์—‘์„ธ์Šค ํ† ํฐ
  • Response : { email, username, nickname, authorities }
  • ์˜ˆ์‹œ

<ํšŒ์› ํƒˆํ‡ด>

  • Request : DELETE (์—‘์„ธ์Šค ํ† ํฐ)
  • Response : ํšŒ์› ํƒˆํ‡ด ์„ฑ๊ณต / ์‹คํŒจ ์‹œ ๋‹ค์Œ ์ฒจ๋ถ€
  • ์˜ˆ์‹œ


๐Ÿงธ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„(๊ฐ„๋žตํ•˜๊ฒŒ)

1. ์œ ์ € ๊ด€๋ จ

  • ํšŒ์›๊ฐ€์ž…
  • ๋กœ๊ทธ์ธ
  • ํ† ํฐ ์žฌ๋ฐœ๊ธ‰
  • ๋กœ๊ทธ์•„์›ƒ
  • ์ •๋ณด ์กฐํšŒ(ํ•ด๋‹น ์œ ์ €๋งŒ)
  • ์ •๋ณด ์ˆ˜์ •(ํ•ด๋‹น ์œ ์ €๋งŒ)
  • ํšŒ์› ํƒˆํ‡ด
  • ์ด๋ฉ”์ผ์€ ์ ˆ๋Œ€ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ํ•จ.(์ด๋ฉ”์ผ๋กœ ๊ด€๋ฆฌ)

2. ๊ทธ ์™ธ

  • POSTMAN์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ

๐ŸงธDB ํ…Œ์ด๋ธ” ์„ค๊ณ„

โœ… ์˜ˆ์ƒํ•œ ๋ฒ„์ „(์ด ๋ฒ„์ „ ์—ญ์‹œ ํ™•์ • ๋ฒ„์ „์€ ์•„๋‹™๋‹ˆ๋‹ค.)

โš™๏ธ ๊ณ ๋ คํ•œ ์‚ฌํ•ญ๋“ค

โœ’๏ธ USER_LOG(ํŒŒ์ผ๋กœ ์ €์žฅํ•  ์˜ˆ์ •)์— ๋Œ€ํ•ด์„œ ํฐ ํ•„์š”์„ฑ์„ ๋Š๋ผ์ง€ ๋ชปํ•ด ์šฐ์„  ๊ฐœ๋ฐœ์—์„œ ์ œ์™ธ์‹œ์ผฐ์Œ.
โœ’๏ธ ๊ถŒํ•œ์— ๋Œ€ํ•œ ํ…Œ์ด๋ธ” ์ด๋ฆ„ ๋ณ€๊ฒฝ : ROLE -> authority & user_authority๋กœ ๊ตฌ๋ถ„
(ROLE_ADMIN, ROLE_USER ๋“ฑ์œผ๋กœ ''์„ ์ •ํ•  ๊ฒฝ์šฐ ํ˜ผ๋™์„ ์šฐ๋ คํ•˜์—ฌ authority๋กœ ํ…Œ์ด๋ธ” ์ด๋ฆ„ ๋ณ€๊ฒฝ)
โœ’๏ธ auto_increment -> hibernate_sequence ํ…Œ์ด๋ธ”์˜ ์‚ฌ์šฉ[sequence(next_val)]

-> ์ฃผ๋กœ ์˜ค๋ผํด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ, auto_increment๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ์ ‘์†ํ•˜์—ฌ ํ™•์ธํ•˜๋ฉด ๋˜์ง€๋งŒ ํ˜น์‹œ๋‚˜ ๋ฒˆํ˜ธ๊ฐ€ ๊ผฌ์—ฌ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฐ์ œํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.(์‹ค์ œ๋กœ auto๋ฅผ ๋ฏฟ์—ˆ๋‹ค๊ฐ€ ์™„์ „ํžˆ ๊ผฌ์ธ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค..)
-> ๋˜ํ•œ ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์ด ์—†์–ด ์ˆœ์„œ๊ฐ€ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๊ณ  ์„ค๊ณ„๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ๊ฒ€์ฆํ•˜๋ฉฐ ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋Š” ํŽธ์ด๋ผ next_val์„ ์‚ฌ์šฉํ•˜๋Š” ์‹œํ€€์Šค ์ „๋žต์„ ์จ์„œ ID ๊ฐ’์„ ๋ถ€์—ฌํ•จ.

โœ… ์ˆ˜์ • ๋ฒ„์ „(ํ˜„์‹ค์ ์œผ๋กœ ๋‚ด๊ฐ€ ๊ณ ๋ คํ•˜๋ฉฐ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค.)


profile
์–ธ์  ๊ฐ€ ๋‚ด ์ฝ”๋“œ๋กœ ์„ธ์ƒ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋„๋ก, BE ๊ฐœ๋ฐœ ๊ธฐ๋ก ๋…ธํŠธโ˜˜๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€