Study/Java

[TIL] OAuth2 ์ธ์ฆ

hong- 2022. 8. 3. 17:03

๐Ÿ‘๐Ÿป OAuth2

  - ํด๋ผ์ด์–ธํŠธ - ์„œ๋ฒ„ - ์ œ 3์˜ ์„œ๋น„์Šค ์‚ฌ์ด์˜ ์ธ์ฆ

  - ์ธ์ฆ์„ ์œ„ํ•œ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์˜ ํ•œ ์ข…๋ฅ˜

  - ๋ณด์•ˆ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ(์—‘์„ธ์Šค)ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ถŒํ•œ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ

  - ์ฆ‰, ์ด๋ฏธ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์›น ์„œ๋น„์Šค ( ์นด์นด์˜ค, ๊นƒํ—™, ๊ตฌ๊ธ€, ํŽ˜์ด์Šค๋ถ ๋“ฑ )์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ๋Œ€์‹ ํ•ด์ฃผ๊ณ 

     ์ ‘๊ทผ ๊ถŒํ•œ์— ๋Œ€ํ•œ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ ํ›„ ์ด๋ฅผ ์ด์šฉํ•ด์„œ ๋‚ด ์„œ๋ฒ„์—์„œ ์ธ์ฆ์ด ๊ฐ€๋Šฅํ•ด์ง

  - ์ธ์ฆ๋งŒ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ๋งก๊ธฐ๊ณ  ์ธ๊ฐ€๋Š” ๋‚ด ์„œ๋ฒ„์—์„œ !

      โ‘  ํŽธ๋ฆฌํ•œ ์ธ์ฆ       โ‘ก ๋ณด์•ˆ์ƒ ์ด์ 

๐Ÿ’ก Resource Owner 

  - ์•ก์„ธ์Šค ์ค‘์ธ ๋ฆฌ์†Œ์Šค์˜ ์œ ์ €

  - ๊ทธ๋ฆผ์—์„œ User๋ฅผ ์˜๋ฏธ ( User์˜ Facebook ๊ณ„์ •์„ ์ด์šฉํ•ด์„œ APP์— ๋กœ๊ทธ์ธ ํ•  ๊ฒฝ์šฐ User๋Š” Resource Owner)

๐Ÿ’ก Client 

  - Resource Owner๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์—‘์„ธ์Šค ํ•˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ

  - ๊ทธ๋ฆผ์—์„œ APP์„ ์˜๋ฏธ ( User๊ฐ€ A๋ผ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Facebook์˜ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ์ด์šฉํ•ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด A๋Š” ํด๋ผ์ด์–ธํŠธ )

๐Ÿ’ก Resource Server 

  - User์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  Client์˜ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๊ณ  ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„

  - Authorization Server๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์Œ

  - ๊ทธ๋ฆผ์—์„œ Facebook์„ ์˜๋ฏธ ( A๋ผ๋Š” App์ด Facebook ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ Facebook์ด ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„ )

๐Ÿ’ก Authorization Server

  - Resource Server๊ฐ€ ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›๋Š” ์„œ๋ฒ„

  - ๊ทธ๋ฆผ์—์„œ Facebook์„ ์˜๋ฏธ

๐Ÿ’ก Authorization Grant

  - ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•ก์„ธ์Šค ํ† ํฐ์„ ์–ป๋Š” ๋ฐฉ๋ฒ•

   โ‘  Authorization Code Grant Type

   โ‘ก Client Credentials Grant Type

   โ‘ข Implicit Grant Type

   โ‘ฃ Resource Owner Credentials Grant Type

๐Ÿ’ก Authorization Code

  - Access token์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์ „์— ํ•„์š”ํ•œ ์ฝ”๋“œ

  - ํด๋ผ์ด์–ธํŠธ ID๋กœ ์ด ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์˜จ ํ›„, ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ๊ณผ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์•ก์„ธ์Šค ํ† ํฐ ๋ฐœ๊ธ‰ ๊ฐ€๋Šฅ

๐Ÿ’ก Access Token

  - ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์—‘์„ธ์Šคํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ธ์ฆ ํ† ํฐ

  - Authorization Code์™€ Client Secret์„ ์ด์šฉํ•ด ๋ฐ›์•„์˜จ ์•ก์„ธ์Šค ํ† ํฐ์œผ๋กœ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์ ‘๊ทผ

๐Ÿ’ก Scope

  - ํ† ํฐ์˜ ๊ถŒํ•œ ( ์ ‘๊ทผ ๊ถŒํ•œ ์ง€์ • ๊ฐ€๋Šฅ )

  - ์ฃผ์–ด์ง„ ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค ๋ฒ”์œ„


๐Ÿ“ OAuth2 ์˜ ๋™์ž‘ ๋ฐฉ์‹

โ–ช๏ธ ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐฉ์‹์— ๋”ฐ๋ฅธ ํ”„๋กœํ† ์ฝœ : ์ธ์ฆ ๋ฐฉ์‹

 โ–ธ Authorization Code Grant : ๊ถŒํ•œ ๋ถ€์—ฌ ์Šน์ธ ์ฝ”๋“œ ๋ฐฉ์‹ 

  - ๊ถŒํ•œ ๋ถ€์—ฌ ์Šน์ธ์„ ์œ„ํ•ด ์ž์ฒด ์ƒ์„ฑํ•œ Authorization Code๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹

  - ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  - ๊ถŒํ•œ ๋ถ€์—ฌ ์Šน์ธ ์š”์ฒญ ์‹œ ์‘๋‹ต ํƒ€์ž…์„ Code๋กœ ์ง€์ •ํ•˜์—ฌ ์š”์ฒญ


 โ–ธ Client Credentials Grant : ํด๋ผ์ด์–ธํŠธ ์ž๊ฒฉ ์ฆ๋ช… ์Šน์ธ ๋ฐฉ์‹

  - ํด๋ผ์ด์–ธํŠธ ์ž์‹ ์ด ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ํ˜น์€ ๊ถŒํ•œ ์„œ๋ฒ„์— ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ œํ•œ๋œ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๊ถŒํ•œ ์„ค์ •๋˜๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  - ์ž๊ฒฉ ์ฆ๋ช…์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ


 โ–ธ Implicit Grant : ์•”๋ฌต์  ์Šน์ธ ๋ฐฉ์‹

  - ๋ณ„๋„์˜ ๊ถŒํ•œ ๋ถ€์—ฌ ์Šน์ธ ์ฝ”๋“œ ์—†์ด ๋ฐ”๋กœ ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์Œ

  - ์ž๊ฒฉ์ฆ๋ช…์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•˜๊ธฐ ํž˜๋“  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ตœ์ ํ™”๋œ ๋ฐฉ์‹

  - ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ 

  - Client Secret์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ๊ณผ์ •์„ ์ƒ๋žต

  - ๊ถŒํ•œ ๋ถ€์—ฌ ์Šน์ธ ์š”์ฒญ ์‹œ ์‘๋‹ตํƒ€์ž…์„ token์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ์š”์ฒญ


 โ–ธ Resource Owner Password Credential Grant : ์ž์› ์†Œ์œ ์ž ์ž๊ฒฉ ์ฆ๋ช… ์Šน์ธ ๋ฐฉ์‹

  - ๊ฐ„๋‹จํ•˜๊ฒŒ ๋กœ๊ทธ์ธ์‹œ ํ•„์š”ํ•œ ์ •๋ณด๋กœ ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›๋Š” ๋ฐฉ์‹

  - ์ž์‹ ์˜ ์„œ๋น„์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  - ์˜ˆ๋ฅผ ๋“ค์–ด ๋„ค์ด๋ฒ„ ๊ณ„์ •์œผ๋กœ ๋„ค์ด๋ฒ„ ์›นํˆฐ์— ๋กœ๊ทธ์ธํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹น


๐Ÿ“ Principal Details

  - UserDetails๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด

 

* Spring Security ์„ธ์…˜ ์ •๋ณด๋Š” ๋‹จ 1๊ฐ€์ง€ ํƒ€์ž…์ธ Authentication ๊ฐ์ฒด๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Œ

 โ–ช๏ธ Authentication ๊ฐ์ฒด๋ฅผ ๋‹ด๋Š” 2๊ฐ€์ง€ ํ•„๋“œ

  โ‘  OAuth2User

  - OAuth2๋กœ ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด OAuth2User๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌ ํ•˜๊ฒŒ ๋จ

  โ‘ก UserDetails

  - ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ฉด UserDetails๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋จ

  → OAuth2User์™€ UserDetails์—๋Š” Member ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Œ

   ๐Ÿ‘‰๐Ÿป ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

   (1) UserDetails๋ฅผ PrincipalDetails์— implements ํ•œ ๋’ค Member ๊ฐ์ฒด์— ๋‹ด๊ฒŒ ํ•จ

     - Authentication ๊ฐ์ฒด๋ฅผ ๊ฐ–๋Š” PrincipalDetails๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋จ

     - PrincipalDetails ๊ฐ์ฒด์—๋Š” Member๊ฐ€ ํฌํ•จ๋จ

  (2) OAuth2User ๋˜ํ•œ ๊ฐ™์€ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์ผ๋ฐ˜ ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ์™€ OAuth ์ฒ˜๋ฆฌ๊ฐ€ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ๋ฌธ์ œ ๋ฐœ์ƒ

     - PrincipalDetails implements UserDetails, OAuth2User๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ ํ•ด๊ฒฐ

 

์ฆ‰, Spring Security์˜ ์ธ๋ฉ”๋ชจ๋ฆฌ ์„ธ์…˜ ์ €์žฅ์†Œ์ธ SecurityContextHolder์— ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ์ €์žฅ

   → ์ธ์ฆ ๊ฐ์ฒด์˜ ํƒ€์ž…์€ " Authentication " ํƒ€์ž… ํ•œ ๊ฐ€์ง€

 - Authentication์€ AbstractAuthenticationToken์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ณ  ์ด๋ฅผ 

   UsernamePasswordAuthenticationToken๊ณผ OAuth2LoginAuthenticationToken์ด ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Œ

 

 = AbstractAuthenticationToken = UsernamePasswordAuthenticationToken + OAuth2LoginAuthenticationToken + .. 

 

- UserDetails, OAuth2User์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์Šคํ”„๋ง์ด ์•Œ์•„์„œ

   UserDetails๋Š” UsernamePasswordAuthenticationToken์œผ๋กœ,

   OAuth2User์€ OAuth2LoginAuthenticationToken์œผ๋กœ ๋ณ€ํ™˜

 

- UsernamePasswordAuthenticationToken๊ณผ OAuth2LoginAuthenticationToken์€

   Authentication์˜ ์ž์‹์ด๋‹ˆ SecurityContextHolder์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ

* FormLogin์œผ๋กœ ๋กœ๊ทธ์ธ ํ•˜๋Š” ๊ฒฝ์šฐ
 - ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํšŒ์›๊ฐ€์ž…์„ ๊ฑฐ์นœ ํ›„ ๋กœ๊ทธ์ธ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 
   loadUserByUsername์—์„œ ํšŒ์›์„ ์ฐพ๊ณ  ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜
   
* OAuth2๋กœ ๋กœ๊ทธ์ธ ํ•˜๋Š” ๊ฒฝ์šฐ
 - ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์›๊ฐ€์ž…์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—
   loadUSerByUsername์—์„œ ํšŒ์›์„ ์ฐพ๊ณ 
    (์—†๋Š” ํšŒ์›)์ด๋ผ๋ฉด ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ๋ฅผ
    (์žˆ๋Š” ํšŒ์›)์ด๋ผ๋ฉด FormLogin๊ณผ ๋™์ผํ•˜๊ฒŒ ์ •๋ณด ๋ฐ˜ํ™˜

๐Ÿ’ก@AuthenticationPrincipal

  - ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งค๋ฒˆ ์‚ฌ์šฉ์ž์—๊ฒŒ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋Œ€ ๋งˆ๋‹ค DB์— ์ ‘๊ทผํ•ด์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ

  - ํ•œ ๋ฒˆ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์„ธ์…˜์— ๋‹ด์•„๋†“๊ณ  ์„ธ์…˜์ด ์œ ์ง€๋˜๋Š” ๋™์•ˆ ์œ ์ €๊ฐ์ฒด๋ฅผ DB ์ ‘๊ทผ ์—†์ด ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ์Œ

  (1) ์ปจํŠธ๋กค๋Ÿฌ์—์„œ Principal ๊ฐ์ฒด ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉ

  (2) ์ปจํŠธ๋กค๋Ÿฌ์—์„œ @AuthenticationPrincipal ์„ ์–ธํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ๋ฐ›์•„์˜ค๊ธฐ

  (3) ์ปจํŠธ๋กค๋Ÿฌ์—์„œ @AuthenticationPrincipal ์„ ์–ธํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ์˜ ์–ด๋Œ‘ํ„ฐ ๊ฐ์ฒด ๋ฐ›์•„์˜ค๊ธฐ