[Security] OAuth2.0์ ์ด์ฉํ ์์ ๋ก๊ทธ์ธ (๊ตฌ๊ธ)
by rlaehddnd0422OAuth๋?
OAuth๋ Open Authorization์ ์ฝ์๋ก, ์ธํฐ๋ท ์ฌ์ฉ์๋ค์ด ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๊ณตํ์ง ์๊ณ ๋ค๋ฅธ ์น์ฌ์ดํธ ์์ ์์ ๋ค์ ์ ๋ณด์ ๋ํด ์น์ฌ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ ์ ์๋ ๊ณตํต์ ์ธ ์๋จ์ผ๋ก์ ์ฌ์ฉ๋๋, ์ ๊ทผ ์์์ ์ํ ๊ฐ๋ฐฉํ ํ์ค ํ๋กํ ์ฝ์ ๋๋ค.
- ์์ฒด ์๋ฒ๊ฐ ์๋ OAuth ์ธ์ฆ ๊ณต๊ธ์๋ฅผ ์ฌ์ฉ ( ๊ตฌ๊ธ, ์นด์นด์ค, ๋ค์ด๋ฒ ๋ฑ )
- ์ ๊ทผ ๊ถํ(์ธ๊ฐ)์ ์ฆ๋ช
ํ๋ ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธํด์ค๋๋ค.
- ์ด ์ก์ธ์ค ํ ํฐ ๊ฐ์ผ๋ก ์ ๊ทผ ๊ถํ์ ๊ฒ์ฌํฉ๋๋ค.
- ์์ ๋ก๊ทธ์ธ์ ์ฌ์ฉ
OAuth 2.0 ๊ตฌ์ฑ์์
- Resource Owner : ์ก์ธ์คํ USER
- Authorization Server : USER์๊ฒ Token์ ๋ฐ๊ธํด์ฃผ๋ ๊ณต๊ธ์
- Authorization Code : Access Token์ ์ป๊ธฐ ์ํ ์๊ฒฉ ์ฆ๋ช
- Access Token : ๋ณดํธ๋ ์์์ ์ ๊ทผํ๊ธฐ ์ํ ์๊ฒฉ ์ฆ๋ช ์
- Scpoe : ํ ํฐ์ ๊ถํ์ ์ง์
OAuth ๋์ ๊ณผ์
OAuth ์ธ์ฆ ๋ฐฉ์์ ์ธ์ฆ์ ๊ณผ์ ์ '๋ค๋ฅธ ์๋น์ค์๊ฒ ์์'ํ๋ ์ธ์ฆ ๋ฐฉ์์ ๋๋ค.
๊ตฌ๊ธ์ด ํด์ฃผ๋ ์ผ์ ์น ์ฌ์ดํธ ์ฌ์ฉ์๊ฐ ๊ตฌ๊ธ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ํตํด ๊ตฌ๊ธ์๊ฒ ์ ์กํ ๊ตฌ๊ธ ๊ณ์ ์ ๋ณด๊ฐ ์ ํจํ์ง ํ์ธํ ํ,
์ ํจํ๋ค๋ฉด ํด๋นํ๋ ๊ตฌ๊ธ ์ ์ ์ ๋ณด ์ค ์ผ๋ถ(์ด๋ฆ, ์ฃผ์, ์์ด๋ ๋ฑ)๋ฅผ ๋ด ์น์ฌ์ดํธ์ ์ ๊ณตํด์ฃผ๋ '์ธ์ฆ' ๊ณผ์ ๋ง์ ์ฒ๋ฆฌํฉ๋๋ค.
์ฃผ์ฒด๋ ํฌ๊ฒ ์ธ ๊ฐ์ง๋ก ๋๋ ์ ์์ต๋๋ค.
1. Resource Owner (USER) : ๋ฆฌ์์ค ์์ ์๋ก, ์ฐ๋ฆฌ์ ์๋น์ค๋ฅผ ์ด์ฉํ๋ฉด์, ๊ตฌ๊ธ ํ์ด์ค ๋ถ ๋ฑ์ ํ๋ซํผ์์ ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ณ ์๋ ์ฌ์ฉ์.
2. Client : Resource Server์ ์์์ ์ด์ฉํ๊ณ ์ ํ๋ ์๋น์ค, ์ฆ ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐํ ์๋น์ค๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
3. Authorization & Resource Server : Resource Owner(USER)๋ฅผ ์ธ์ฆํ๊ณ , Client์๊ฒ ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธํด์ฃผ๋ ์๋ฒ ( ๊ตฌ๊ธ, ๋ค์ด๋ฒ, ์นด์นด์ค ๋ฑ )
Client๋ ์ฐ๋ฆฌ๊ฐ ๊ตฌํํ๋ ์๋น์ค์ด๋ฏ๋ก Resource Owner์ ํท๊ฐ๋ฆฌ์ง ์๋๋ก ํฉ์๋ค.
๋์ ๊ณผ์ ์ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
1. Resource Owner(USER) ๊ฐ '๊ตฌ๊ธ๋ก ๋ก๊ทธ์ธ' ๋ฑ ๋ฒํผ์ ํตํด ๋ก๊ทธ์ธ์ ์์ฒญํฉ๋๋ค.
2. Client๋ OAuth ํ๋ก์ธ์ค๋ฅผ ์์ํ๊ธฐ ์ํด ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ฅผ Authorization Server๋ก ๋ณด๋ด์ผ ํ๋๋ฐ, ์ด ๋ Authorization URL๋ก Server๊ฐ ์ ๊ณตํ๋ client_ID, Redirect URI, Scope ๋ฑ ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ๋ณด๋ ๋๋ค.
3, 4. ํด๋ผ์ด์ธํธ๊ฐ ๋น๋ํ Authorization URL๋ก ์ด๋๋ Resource Owner๋ ์ ๊ณต๋ ๋ก๊ทธ์ธ ํ์ด์ง์์ ID ์ PW ๋ฅผ ์ ๋ ฅํ์ฌ ์ธ์ฆํฉ๋๋ค.
5, 6. ์ธ์ฆ(๊ตฌ๊ธ ๋ก๊ทธ์ธ)์ ์ฑ๊ณตํ๋ฉด , Authorization Server๋ ์ ๊ณต๋ Redirect URI๋ก ์ฌ์ฉ์๋ฅผ ๋ฆฌ๋ค์ด๋ ์ ์ํต๋๋ค. ( ์ด ๊ณผ์ ์์ Authorization Code๋ฅผ ํฌํจํ์ฌ ๋ฆฌ๋ค์ด๋ ์ , ๊ตฌ๊ธ์ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ์ฟผ๋ฆฌ์คํธ๋ง์ ํฌํจํฉ๋๋ค.)
7, 8. Client๋ Authorization Server์ Authorization Code, Client_ID, Client Secret์ ์ ๋ฌํ๊ณ , Access Token์ ๋ฆฌํด๋ฐ์ต๋๋ค.
9. ์ ๊ณผ์ ์ ์ฑ๊ณต์ ์ผ๋ก ๋ง์น๋ฉด ๋ก๊ทธ์ธ ์ฑ๊ณต
10. Resource Owner๊ฐ Access Token์ ํตํด Client์๊ฒ ์๋น์ค๋ฅผ ์์ฒญํฉ๋๋ค.
11 ~ 13 . Client๋ ๋ฐ๊ธํ๊ณ ์ ์ฅํด๋ Access Token์ ์ฌ์ฉํ์ฌ Resource Owner์๊ฒ ์ ํ๋ ๋ฆฌ์์ค์ ์ ๊ทผ์ ํ์ฉํ๊ณ , ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
OAuth์ ๊ดํด ๋ง์ ์๋ฃ๋ค์ด ์์์ง๋ง, ๊ทธ ์ค ๊ฐ์ฅ ์ดํดํ๊ธฐ ์ฝ๊ฒ ์ค๋ช ํ ๊ธ์ ์ฐธ๊ณ ํ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ : https://hudi.blog/oauth-2.0/
์ด์ ์ ๋์๊ณผ์ ์ ํ ๋๋ก ๊ตฌ๊ธ ๋ก๊ทธ์ธ์ ๋์ ํด๋ด ์๋ค.
Resource Server API ๋ฐ๊ธ
1. Google API ์ฝ์ ์ ์
https://console.cloud.google.com/apis/dashboard?hl=ko
2. Google Cloud ๋ก๊ณ ์ ๋ฐ์ค ํด๋ฆญ -> ์ ํ๋ก์ ํธ ์์ฑ2
3. ํ๋ก์ ํธ ์ด๋ฆ ์ค์ ๋ฐ ๋ง๋ค๊ธฐ
4. OAuth ๋์ ํ๋ฉด์ ์ฌ์ฉ์ ์ ํ - '์ธ๋ถ' ์ค์
5. ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด์ ๋ค์ด๊ฐ, + ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๋ง๋ค๊ธฐ ํด๋ฆญ ๋ฐ OAuth ํด๋ผ์ด์ธํธ ID ์์ฑ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ผ๋ก ์์ฑ
6. ๋ฆฌ๋ค์ด๋ ์ URI ๋ฑ๋ก
- ๊ตฌ๊ธ ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์ฌ๊ธฐ์ ๋ฑ๋กํ ๋ฆฌ๋ค์ด๋ ์ URI๋ก Authorization Code๋ฅผ ๋ฐ๊ธํฉ๋๋ค.
7. Client ID, Client Secret ๋ฐ๊ธ
- ๊ตฌ๊ธ ๋ก๊ทธ์ธ ์ Authorization URL์ ํจ๊ป ๋ณด๋ผ ์ ๋ณด๋ค์ ๋ฐ๊ธ๋ฐ์ต๋๋ค.
๋ก๊ทธ์ธ ํผ์ '๊ตฌ๊ธ๋ก ๋ก๊ทธ์ธ' ์์ฑ ๋ฐ ๋ฆฌ๋ค์ด๋ ์ href ์ถ๊ฐ
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>๋ก๊ทธ์ธ ํ์ด์ง</title>
</head>
<body>
<h1>๋ก๊ทธ์ธ ํ์ด์ง</h1>
<hr/>
<!-- ์ํ๋ฆฌํฐ๋ x-www-form-url-encoded ํ์
๋ง ์ธ์ -->
<form action="/login" method="post">
<input type="text" name="username" placeholder="Username" />
<input type="password" name="password" placeholder="Password"/>
<button>๋ก๊ทธ์ธ</button>
</form>
<a href="/oauth2/authorization/google">๊ตฌ๊ธ ๋ก๊ทธ์ธ</a>
<a href="/joinForm">ํ์๊ฐ์
์ ์์ง ํ์ง ์์ผ์
จ๋์?</a>
</body>
</html>
- ๋ก๊ทธ์ธ ํผ์์ '๊ตฌ๊ธ ๋ก๊ทธ์ธ'์ ํด๋ฆญํ๋ฉด Resource Server(Google)์์ ๊ตฌ๊ธ ๋ก๊ทธ์ธ ํผ(Authorization URL)๋ก ์ด๋ ํ ๊ตฌ๊ธ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ๋ฆฌ๋ค์ด๋ ์ URI๋ก ์ด๋ํฉ๋๋ค.
- Authorization URL์ ํตํด ๋ก๊ทธ์ธ ํ ๋ ํ์ํ ๋ฐ๊ธ๋ฐ์ ID์ Secret์ด ํ์ํฉ๋๋ค. ์ด ์ ๋ณด๋ค์ yml์ ๋ณ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
- ์ด ๋ ๋ฆฌ๋ค์ด๋ ์ URI๋ก Authorization Code๋ฅผ ํจ๊ป ๋ณด๋ ๋๋ค.
application.yml์ ๋ฐ๊ธ ๋ฐ์ ์ ๋ณด ์ ๋ ฅ
security:
oauth2:
client:
registration:
google:
client-id: ~~
client-secret: ~~
scope:
- email
- profile
- Authorizaiton URL(๊ตฌ๊ธ ๋ก๊ทธ์ธ ํผ)์ ํจ๊ป ์ ์กํ Resource Owner์ ์ ๋ณด๋ฅผ application.yml์ ์ ์ฅํฉ๋๋ค.
Security Filter์ OAuth ์ต์ ์ถ๊ฐ
.and()
.oauth2Login()
.loginPage("/loginForm")
- OAuth๋ฅผ ์ฌ์ฉํ ๋ก๊ทธ์ธ ์ต์ ์ ์ถ๊ฐํด์ฃผ๊ณ OAuth ๋ก๊ทธ์ธ ์ต์ ์ ์ฌ์ฉํ๋ loginPage ๋ํ ์ค์ ํด ์ค์๋ค.
์ด๋ ๊ฒ ํด์ ๋ก๊ทธ์ธ์ด ์๋ฃ๋์์ต๋๋ค.
ํ์ง๋ง ๋ก๊ทธ์ธ(์ธ์ฆ) ์ ์ฐจ๋ง ์๋ฃ ํ์ ๋ฟ, ์์ง OAuth Owner ์ฌ์ฉ์์ ๋ํ ์ธ๊ฐ ์ฒ๋ฆฌ๋ ํ์ง ๋ชปํ ์ํฉ์ ๋๋ค.
( ์์ง ์ ๊ทผ ์ ํ์ด ๊ฑธ๋ฆฐ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ์ ๋ถ๊ฐ๋ฅํ ์ํฉ )
๋ ๋ฟ๋ง ์๋๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ๊ธ๋ก ๋ก๊ทธ์ธํ ํ์์ ์ ๋ณด ์ ์ฅ ๋ํ ํ์ํฉ๋๋ค.
๋ค์ ํฌ์คํ ์์ OAuth ๋ก๊ทธ์ธ ํ์ฒ๋ฆฌ(OAuth Resource Owner์ ๋ํ ์ ๊ทผ ๊ถํ ์ฒ๋ฆฌ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ ์ ์ฅ)์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
<์ ๋ฆฌ>
- OAuth2.0์ Resource Owner, Client, Resource Server ์ธ ๊ฐ์ง ์ฃผ์ฒด์ ์ํธ์์ฉ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
- OAuth2.0์ ํตํด ๋ก๊ทธ์ธํ๊ธฐ ์ํด์๋ Resource Server๋ก๋ถํฐ Client_ID, Client_Secret์ ๋ฐ๊ธ๋ฐ๊ณ , Ower๊ฐ OAuth ๋ก๊ทธ์ธ ์ฑ๊ณต ์(OAuth ID, PW, Client_ID, Client_Secret์ ํตํ) Resource Server์์ Resource Owner์๊ฒ ์ ๋ฌํด์ค code๋ฅผ ์ ๋ฌํ Rediret_URI๋ฅผ ์ค์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค.
- OAuth2.0์ ๋์๊ณผ์ ์ ์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Spring Security' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Security] OAuth2.0 ๋ค์ด๋ฒ, ์นด์นด์ค ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์ถ๊ฐ (0) | 2023.06.01 |
---|---|
[Security] OAuth2.0 ๋ก๊ทธ์ธ ํ์ฒ๋ฆฌ - ๊ถํ ๋ถ์ฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ (0) | 2023.05.31 |
[Security] ๊ถํ ์ฒ๋ฆฌ @PreAuthorize, @PostAuthorize, @Secured (0) | 2023.05.29 |
[Security] Security ํ์๊ฐ์ , ๋ก๊ทธ์ธ (0) | 2023.05.29 |
[Security] Spring Security๋? (1) | 2023.05.29 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422