week 8 leekynnghee - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki


jwt๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ๊ตฌ์„ฑ์€ ์–ด๋–ป๊ฒŒ ๋˜์–ด ์žˆ๊ณ , oAuth(open Authorization)์™€ ์ฐจ์ด๋Š”?

๋ชจ๋ฐ”์ผ ์•ฑ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜, ์ฟ ํ‚ค ๊ด€๋ฆฌ๋ฅผ ํ•˜์ง€๋ชปํ•จ

JWT๋ž€?

  • JSON ํฌ๋งท์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์†์„ฑ์„ ์ €์žฅํ•˜๋Š” Claim ๊ธฐ๋ฐ˜์˜ Web Token์ด๋‹ค. JWT๋Š” ํ† ํฐ ์ž์ฒด๋ฅผ ์ •๋ณด๋กœ ์‚ฌ์šฉํ•˜๋Š” Self-Contained ๋ฐฉ์‹์œผ๋กœ ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค

ํด๋ ˆ์ž„? Self-Contained ๋ฐฉ์‹?์€ ๋ฌด์—‡์ด์ง€? ์•„๋ž˜์—์„œ ์ข€๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


JWT ์‚ฌ์šฉ๋ฒ•?

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ, JWT๋ฅผ static ๋ณ€์ˆ˜์™€ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.
  • static ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋Š” ์ด์œ ๋Š” HTTP ํ†ต์‹ ์„ ํ•  ๋•Œ๋งˆ๋‹ค JWT๋ฅผ HTTP ํ—ค๋”์— ๋‹ด์•„์„œ ๋ณด๋‚ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์—์„œ ๊ณ„์† ๋ถˆ๋Ÿฌ์˜ค๋ฉด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์—์„œ JWT๋ฅผ ํฌํ•จํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๋Š” ํ—ˆ๊ฐ€๋œ JWT์ธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.
  • ๋˜ํ•œ ๋กœ๊ทธ์•„์›ƒ์„ ํ•  ๊ฒฝ์šฐ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ JWT ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

(์‹ค์ œ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ์—๋Š” ๋กœ๊ทธ์•„์›ƒ ์‹œ, ์‚ฌ์šฉํ–ˆ๋˜ ํ† ํฐ์„ blacklist๋ผ๋Š” DB ํ…Œ์ด๋ธ”์— ๋„ฃ์–ด ํ•ด๋‹น ํ† ํฐ์˜ ์ ‘๊ทผ์„ ๋ง‰๋Š” ์ž‘์—…์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.)

JWT ํŠน์ง•

  • JSON ์›น ํ† ํฐ์€ ํŽ˜์ด๋กœ๋“œ์— ๋ช‡ ๊ฐ€์ง€ ํด๋ ˆ์ž„์„ ์ œ๊ธฐํ•˜๋Š” JSON์ด ํฌํ•จ ๋œ ์„ ํƒ์  ์„œ๋ช… ๋ฐ / ๋˜๋Š” ์„ ํƒ์  ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ์œ„ํ•œ ์ธํ„ฐ๋„ท ํ‘œ์ค€์ž…๋‹ˆ๋‹ค.
  • ํ† ํฐ์€ ๊ฐœ์ธ ๋น„๋ฐ€ ๋˜๋Š” ๊ณต๊ฐœ / ๊ฐœ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ํ† ํฐ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ๊ณผ ํด๋ ˆ์ž„(Claim) ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ

  • ์ผ๋ฐ˜ ํ† ํฐ ๊ธฐ๋ฐ˜์€ ๊ณผ๊ฑฐ์— ๋งŽ์ด ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ์‹์ด๋‹ค. ์ฃผ๋กœ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๋ฌธ์ž์—ด(Random string) ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„์ด ๋œ๋‹ค.
{
    "code": 0,
    "msg": null,
    "response":{
        "token": "a9ace025c90c0da2161075da6ddd3492a2fca776",
        "now": 1512446940,
        "expired_at": 1512448740
    }
}

์ผ๋ฐ˜ ํ† ํฐ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ์ ์€?

  • ์ด๋Ÿฐ ์ผ๋ฐ˜ ํ† ํฐ์€ ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ณด๋ฅผ ๋‹ด๊ฑฐ๋‚˜ ํ•  ์ˆ˜ ์—†๋‹ค. ํฌ๊ฒŒ ๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ๋ฐœ๊ธ‰๋œ ํ† ํฐ์— ๋Œ€ํ•ด์„œ ๋งŒ๋ฃŒ๋ฅผ ์‹œํ‚ฌ ์ˆ˜๋‹จ์ด ์—†๋‹ค.
  • ๋ฐœ๊ธ‰๋œ ํ† ํฐ์„ ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งˆ๋‹ค DB์— ์ ‘๊ทผํ•˜์—ฌ ๊ฒ€์‚ฌํ•  ๊ฒฝ์šฐ ๋ถ€๋‹ด์ด ์ƒ๊ธด๋‹ค.
  • ์‚ฌ์šฉ์ž ๋กœ๊ทธ์•„์›ƒ ๋“ฑ์œผ๋กœ ์ธํ•œ ํ† ํฐ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.
  • ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์–ด๋Š์ •๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํด๋ ˆ์ž„(Claim) ๊ธฐ๋ฐ˜ ํ† ํฐ ๋ฐฉ์‹์ด๋‹ค.

ํด๋ ˆ์ž„(Claim)์ด๋ž€ ์‚ฌ์šฉ์ž ์ •๋ณด๋‚˜ ๋ฐ์ดํ„ฐ ์†์„ฑ ๋“ฑ์„ ์˜๋ฏธํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ํด๋ ˆ์ž„ ํ† ํฐ์ด๋ผ ํ•˜๋ฉด ํ† ํฐ ์•ˆ์— ์ €๋Ÿฐ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํ† ํฐ์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํด๋ ˆ์ž„ ๊ธฐ๋ฐ˜์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

{
  "id":"mhlab",
  "role":["admin","hr"],
  "company":"hexlant"
}

์ด๋Ÿฐ ํด๋ ˆ์ž„์„ ๊ธฐ๋ฐ˜ํ•œ ํ† ํฐ ์ค‘ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด ๋ฐ”๋กœ JWT๋‹ค.

What is JWT?

  • JWT(Json Web Token)์€ ์œ„์—์„œ ์ด์•ผ๊ธฐ ํ•œ ํด๋ ˆ์ž„ ๊ธฐ๋ฐ˜ ํ† ํฐ์ด๋ฉฐ, ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ JSON์„ ์ด์šฉํ•œ ํ† ํฐ์ด๊ณ  ์›น ํ‘œ์ค€(RFC 7519)๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.
  • ์ž์„ธํ•œ ๋‚ด์šฉ์€ JWT ๊ณต์‹ํŽ˜์ด์ง€์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ตฌ์กฐ์™€ ์ƒ์„ฑ

HEADER.PAYLOAD.SIGNATURE

  • ํ—ค๋”(Header), ํŽ˜์ด๋กœ๋“œ(Payload), ์„œ๋ช…(Signature) ์„ธ ๋ถ€๋ถ„์„ ์ (.)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ตฌ์กฐ๋‹ค.

Header

  • JWT๋ฅผ ๊ฒ€์ฆํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ JSON ๊ฐ์ฒด๋Š” Base64 URL-Safe ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์ด๋‹ค.
  • ํ—ค๋”(Header)๋Š” JWT๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆ(Verify)ํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ๋‹ค.
  • ์ฐธ๊ณ ๋กœ alg๋Š” ์„œ๋ช… ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ณ , kid๋Š” ์„œ๋ช… ์‹œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค(Public/Private Key)๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’์ด๋‹ค.
{
    "alg": "ES256",
    "kid": "Key ID"
}
  • ์œ„์™€ ๊ฐ™์€ JSON ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ  UTF-8๊ณผ Base64 URL-Safe๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ—ค๋”๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
Base64URLSafe(UTF-8('{"alg": "ES256","kid": "Key ID"}')) -> eyJhbGciOiJFUzI1NiIsImtpZCI6IktleSBJRCJ9

Payload

  • JWT์˜ ๋‚ด์šฉ์ด๋‹ค. ํŽ˜์ด๋กœ๋“œ(Payload)์— ์žˆ๋Š” ์†์„ฑ๋“ค์„ ํด๋ ˆ์ž„ ์…‹(Claim Set)์ด๋ผ ๋ถ€๋ฅธ๋‹ค.
  • ํด๋ ˆ์ž„ ์…‹์€ JWT์— ๋Œ€ํ•œ ๋‚ด์šฉ(ํ† ํฐ ์ƒ์„ฑ์ž(ํด๋ผ์ด์–ธํŠธ)์˜ ์ •๋ณด, ์ƒ์„ฑ ์ผ์‹œ ๋“ฑ)์ด๋‚˜ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ์ฃผ๊ณ  ๋ฐ›๊ธฐ๋กœ ํ•œ ๊ฐ’๋“ค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
{
    "iss": "jinho.shin",
    "iat": "1586364327"
}
  • ์œ„์™€ ๊ฐ™์€ JSON ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ  Base64 URL-Safe๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
Base64URLSafe('{"iss": "jinho.shin","iat": "1586364327"}') -> eyJpYXQiOjE1ODYzNjQzMjcsImlzcyI6ImppbmhvLnNoaW4ifQ

Signature

  • ์ (.)์„ ๊ตฌ๋ถ„์ž๋กœ ํ•ด์„œ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ํ•ฉ์นœ ๋ฌธ์ž์—ด์„ ์„œ๋ช…ํ•œ ๊ฐ’์ด๋‹ค. ์„œ๋ช…์€ ํ—ค๋”์˜ alg์— ์ •์˜๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„๋ฐ€ ํ‚ค๋ฅผ ์ด์šฉํ•ด ์„ฑ์„ฑํ•˜๊ณ  Base64 URL-Safe๋กœ ์ธ์ฝ”๋”ฉํ•œ๋‹ค.
Base64URLSafe(Sign('ES256', '${PRIVATE_KEY}',
'eyJhbGciOiJFUzI1NiIsImtpZCI6IktleSBJRCJ9.eyJpYXQiOjE1ODYzNjQzMjcsImlzcyI6ImppbmhvLnNoaW4ifQ'))) ->
MEQCIBSOVBBsCeZ_8vHulOvspJVFU3GADhyCHyzMiBFVyS3qAiB7Tm_MEXi2kLusOBpanIrcs2NVq24uuVDgH71M_fIQGg

JWT

  • ์ ์„ ๊ตฌ๋ถ„์ž๋กœ ํ•ด์„œ ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ, ์„œ๋ช…์„ ํ•ฉ์น˜๋ฉด JWT๊ฐ€ ์™„์„ฑ๋œ๋‹ค.
eyJhbGciOiJFUzI1NiIsImtpZCI6IktleSBJRCJ9.eyJpYXQiOjE1ODYzNjQzMjcsImlzcyI6ImppbmhvLn
NoaW4ifQ.eyJhbGciOiJFUzI1NiIsImtpZCI6IktleSBJRC9.eyJpYXQiOjE1ODYzNjQzMjcsImlzcyI6Imp
pbmhvLnNoaW4ifQ.MEQCIBSOVBBsCeZ_8vHulOvspJVFU3GADhyCHyzMiBFVyS3qAiB7Tm_ME
Xi2kLusOBpanIrcs2NVq24uuVDgH71M_fIQGg
  • ์ด๋ ‡๊ฒŒ ์™„์„ฑ๋œ JWT๋Š” ํ—ค๋”์˜ alg, kid ์†์„ฑ๊ณผ ๊ณต๊ฐœ ํ‚ค๋ฅผ ์ด์šฉํ•ด ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„œ๋ช… ๊ฒ€์ฆ์ด ์„ฑ๊ณตํ•˜๋ฉด JWT์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜๊ณ , ํŽ˜์ด๋กœ๋“œ์˜ ๊ฐ’์œผ๋กœ ์ ‘๊ทผ ์ œ์–ด๋‚˜ ์›ํ•˜๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

JWT๋ฅผ ํ†ตํ•œ Client-Server๊ฐ„ ์ธ์ฆ ๊ณผ์ •

  • Client์—์„œ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด Server์—์„œ ๋กœ๊ทธ์ธ ํ™•์ธ ํ›„ secret key๋ฅผ ํ†ตํ•ด Access token์„ ๋ฐœ๊ธ‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— JWT๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
  • ๊ทธ ํ›„ JWT๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณด๊ด€ํ•˜๋‹ค ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•  ๋•Œ ๋งˆ๋‹ค JWT๋ฅผ ๊ฐ™์ด Request Header์— ์ „๋‹ฌํ•ด์ฃผ๋ฉด
  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ค€ JWT์˜ ์„œ๋ช…์„ ์ฒดํฌํ•˜๊ณ  JWT์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ™•์ธํ•œ ๋’ค
  • ์˜ฌ๋ฐ”๋ฅผ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ์˜ Request์— ๋งž๋Š” Response๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋งž์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ทธ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

JWT ์žฅ์ 

  • ์‚ฌ์šฉ์ž ์ธ์ฆ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋Š” ํ† ํฐ ์ž์ฒด์— ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์ธ์ฆ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”์—†๋‹ค.


OAuth2 ๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋‚˜?

  1. ๊ตฌ๊ธ€์ด๋‚˜ ํŽ˜์ด์Šค๋ถ ๊ตญ๋‚ด์—์„œ๋Š” ๋„ค์ด๋ฒ„๋‚˜ ์นด์นด์˜ค ๋“ฑ ๋กœ๊ทธ์ธํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๋ฉด ๊ตฌํ˜„์˜ ๋‚œ์ด๋„๋ฅผ ๋‚ฎ์ถ” ์ˆ˜ ์žˆ๊ณ  ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋˜ํ•œ ๋Œ€ํ˜• ๋ณด์•ˆ ์‚ฌ๊ณ ์˜ ์œ„ํ—˜์„ ์ „๋ฌธ ์ธ๋ ฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ๋Š” ๊ฑฐ๋Œ€ ๊ธฐ์—…๋“ค์—๊ฒŒ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  3. ๋ฌด์—‡๋ณด๋‹ค ์ด๋“ค ๊ธฐ์—…์˜ API๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ์ฆ์ด ํ•„์š”ํ•œ๋ฐ ์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์—…๋“ค์ด OAuth๋ฅผ ์ธ์ฆ์œผ๋กœ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋‹ค.

OAuth ๋ž€ ๋ฌด์—‡์ด๋ฉฐ Protocol flow์€?

OAuth๋Š” ์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž๋“ค์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์›น์‚ฌ์ดํŠธ ์ƒ์˜ ์ž์‹ ๋“ค์˜ ์ •๋ณด์— ๋Œ€ํ•ด ์›น์‚ฌ์ดํŠธ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต์ ์ธ ์ˆ˜๋‹จ์œผ๋กœ์„œ ์‚ฌ์šฉ๋˜๋Š” ์ ‘๊ทผ ์œ„์ž„์„ ์œ„ํ•œ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€(IEEE, ISOC, W3C, IETF ๋ฐ IAB ๊ณต๋™ ์ •์˜)์ด๋‹ค

OAuth is an open standard for access delegation commonly used as a way for Internet users to grant websites or applications access to their information on other websites but without giving them the passwords.

Open Authorization์ด ๋‚˜์˜ค๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ

  • OAuth๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ์ „์—๋Š” ์ธ์ฆ๋ฐฉ์‹์˜ ํ‘œ์ค€์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ ๊ธฐ๋ณธ์ธ์ฆ์ธ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ, ์ด๋Š” ๋ณด์•ˆ์ƒ ์ทจ์•ฝํ•œ ๊ตฌ์กฐ์ด๋‹ค.
  • ๊ธฐ๋ณธ ์ธ์ฆ์ด ์•„๋‹ ๊ฒฝ์šฐ๋Š” ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์ด ๊ฐ์ž์˜ ๊ฐœ๋ฐœํ•œ ํšŒ์‚ฌ์˜ ๋ฐฉ๋ฒ•๋Œ€๋กœ ์‚ฌ์šฉ์ž๋ฅผ ํ™•์ธํ•˜์˜€๋‹ค.
  • OAuth๋Š” ์ด๋ ‡๊ฒŒ ์ œ๊ฐ๊ฐ์ธ ์ธ์ฆ๋ฐฉ์‹์„ ํ‘œ์ค€ํ™”ํ•œ ์ธ์ฆ ๋ฐฉ์‹์ด๋‹ค.
  • OAuth๋ฅผ ์ด์šฉํ•˜๋ฉด ์ด ์ธ์ฆ์„ ๊ณต์œ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ผ๋ฆฌ๋Š” ๋ณ„๋„์˜ ์ธ์ฆ์ด ํ•„์š” ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

image1

image2

  1. Resource Owner(์‚ฌ์šฉ์ž)๊ฐ€ Client(์šฐ๋ฆฌ ์„œ๋ฒ„)์—๊ฒŒ ์ธ์ฆ ์š”์ฒญ์„ ํ•ฉ๋‹ˆ๋‹ค.

  2. Client๋Š” Authorization Request๋ฅผ ํ†ตํ•ด Resource Owner์—๊ฒŒ ์ธ์ฆํ•  ์ˆ˜๋‹จ(ex Facebook, Google ๋กœ๊ทธ์ธ url)์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  3. Resource Owner๋Š” ํ•ด๋‹น Request๋ฅผ ํ†ตํ•ด ์ธ์ฆ์„ ์ง„ํ–‰ํ•˜๊ณ  ์ธ์ฆ์„ ์™„๋ฃŒํ–ˆ๋‹ค๋Š” ์‹ ํ˜ธ๋กœ Authorization Grant๋ฅผ url์— ์‹ค์–ด Client์—๊ฒŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  4. Client๋Š” ํ•ด๋‹น ๊ถŒํ•œ์ฆ์„œ(Authorization Grant)๋ฅผ Authorization Server์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  5. Authorization Server๋Š” ๊ถŒํ•œ์ฆ์„œ๋ฅผ ํ™•์ธ ํ›„, ์œ ์ €๊ฐ€ ๋งž๋‹ค๋ฉด Client์—๊ฒŒ Access Token, Refresh Token, ๊ทธ๋ฆฌ๊ณ  ์œ ์ €์˜ ํ”„๋กœํ•„ ์ •๋ณด(id ํฌํ•จ) ๋“ฑ์„ ๋ฐœ๊ธ‰ํ•ด์ค๋‹ˆ๋‹ค.

  6. Client๋Š” ํ•ด๋‹น Access Token์„ DB์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ Resource Owner์—๊ฒŒ ๋„˜๊น๋‹ˆ๋‹ค.

  7. Resource Owner(์‚ฌ์šฉ์ž)๊ฐ€ Resource Server์— ์ž์›์ด ํ•„์š”ํ•˜๋ฉด, Client๋Š” Access Token์„ ๋‹ด์•„ Resource Server์— ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

  8. Resource Server๋Š” Access Token์ด ์œ ํšจํ•œ์ง€ ํ™•์ธ ํ›„, Client์—๊ฒŒ ์ž์›์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  9. ๋งŒ์ผ Access Token์ด ๋งŒ๋ฃŒ๋๊ฑฐ๋‚˜ ์œ„์กฐ๋˜์—ˆ๋‹ค๋ฉด, Client๋Š” Authorization Server์— Refresh Token์„ ๋ณด๋‚ด Access Token์„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  10. ๊ทธ ํ›„ ๋‹ค์‹œ Resource Server์— ์ž์›์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

  11. ๋งŒ์ผ Refresh token๋„ ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๊ฒฝ์šฐ, Resource Owner๋Š” ์ƒˆ๋กœ์šด Authorization Grant๋ฅผ Client์—๊ฒŒ ๋„˜๊ฒจ์•ผํ•ฉ๋‹ˆ๋‹ค. (์ด๋Š” ๋‹ค์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์‹œ ๋กœ๊ทธ์ธ ํ•˜๋ผ๋Š” ๋ง์ž…๋‹ˆ๋‹ค.)

OAuth2 ์Šน์ธ ๋ฐฉ์‹์˜ ์ข…๋ฅ˜

  1. Authorization Code Grant Type : ๊ถŒํ•œ ๋ถ€์—ฌ ์ฝ”๋“œ ์Šน์ธ ํƒ€์ž…
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ๋Œ€์‹  ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ์„ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ์Šค์†Œ ์ ‘๊ทผ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ๋ช…๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ถŒํ•œ ์„œ๋ฒ„์— ์š”์ฒญํ•ด์„œ ๋ฐ›์€ ๊ถŒํ•œ ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐ›๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  1. Implicit Grant Type : ์•”์‹œ์  ์Šน์ธ
  • ๊ถŒํ•œ ๋ถ€์—ฌ ์ฝ”๋“œ ์Šน์ธ ํƒ€์ž…๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ถŒํ•œ ์ฝ”๋“œ ๊ตํ™˜ ๋‹จ๊ณ„ ์—†์ด ์—‘์„ธ์Šค ํ† ํฐ์„ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋ฐ›์•„ ์ด๋ฅผ ์ธ์ฆ์— ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  1. Resource Owner Password Credentials Grant Type : ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž ์•”ํ˜ธ ์ž๊ฒฉ ์ฆ๋ช… ํƒ€์ž…
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—‘์„ธ์Šค ํ† ํฐ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ตํ™˜ํ•˜๋Š” ๋•Œ์ž…๋‹ˆ๋‹ค.
  1. Client Credentials Grant Type : ํด๋ผ์ด์–ธํŠธ ์ž๊ฒฉ ์ฆ๋ช… ํƒ€์ž…
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ปจํ…์ŠคํŠธ ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šค ํ† ํฐ์„ ์–ป์–ด ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ์„ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

[์ฐธ๊ณ ]

http://tools.ietf.org/html/rfc6749

[์ฝ์–ด๋ณด๊ธฐ]

  • OAuth2 4๊ฐ€์ง€ ๋ฐฉ์‹ ์ƒ์„ธ ๋‚ด์šฉ

https://okky.kr/article/420615

[์‹ค์Šต]

https://okky.kr/article/365347


์˜จํ”„๋กœ๋ฏธ์Šค ํ™˜๊ฒฝ๊ณผ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์˜ ์ฐจ์ด ๋ฐ ์žฅ๋‹จ์ 

image3

image4

  • ์„œ๋ฒ„๋ฆฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋ฉด ์ธํ”„๋ผ ๊ด€๋ฆฌ ๋ฐ ์šด์˜ ๋Œ€์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • AWS์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ํ”„๋กœ๋น„์ €๋‹์ด๋‚˜ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธํ”„๋ผ ๊ด€๋ฆฌ ๋ถ€๋‹ด์ด ์ค„์–ด๋“ค๊ณ  ์ œํ’ˆ ์ถœ์‹œ๋ฅผ ์•ž๋‹น๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„๋ฆฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•์— ๋”ฐ๋ฅธ 4๊ฐ€์ง€ ์ฃผ์š” ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ๊ด€๋ฆฌ ๋ถˆํ•„์š”

  • ์„œ๋ฒ„๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ฑฐ๋‚˜ ์œ ์ง€ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์„ค์น˜, ์œ ์ง€ ๋˜๋Š” ๊ด€๋ฆฌํ•  ์†Œํ”„ํŠธ์›จ์–ด๋‚˜ ๋Ÿฐํƒ€์ž„์ด ์—†์Šต๋‹ˆ๋‹ค.

์œ ์—ฐํ•œ ํ™•์žฅ์„ฑ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž๋™์œผ๋กœ ํ™•์žฅ๋  ์ˆ˜ ์žˆ๊ณ , ๊ฐœ๋ณ„ ์„œ๋ฒ„ ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ ๋‹จ์œ„(์˜ˆ: ์ฒ˜๋ฆฌ๋Ÿ‰, ๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ์„ค์ •/ํ•ด์ œํ•˜์—ฌ ์šฉ๋Ÿ‰์„ ์กฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๊ฐ€์šฉ์„ฑ

  • ์„œ๋ฒ„๋ฆฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‚ด์žฅ๋œ ๊ฐ€์šฉ์„ฑ๊ณผ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์„ค๊ณ„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์œ ํœด ์šฉ๋Ÿ‰ ์—†์Œ

  • ์œ ํœด ์šฉ๋Ÿ‰์— ๋Œ€ํ•œ ๋น„์šฉ์„ ์ง€๋ถˆํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ปดํ“จํŒ…์ด๋‚˜ ์Šคํ† ๋ฆฌ์ง€ ๋“ฑ์˜ ์šฉ๋Ÿ‰์„ ์‚ฌ์ „ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฒ„ ํ”„๋กœ๋น„์ €๋‹ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์„ ๋•Œ๋Š” ๋น„์šฉ์ด ๋ถ€๊ณผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://blog.lgcns.com/1613

https://www.slideshare.net/awskorea/aws-aws-aws-101-webinar


์ž๋ฐ” 8 ํŠน์ง•

String, StringBuilder, StringBuffer ์ฐจ์ด

dispatcherServlet์ด๋ž€?

JPA Persistence๋ž€?