dva์ OAuth2 ์์ , ๋ชจ๋ฌ ๊ตฌ์ฑ ๋ฐฉ๋ฒ, ๊ถํ ํ์ธ ๋ฐฉ๋ฒ์ด ์๋์?
oauth2 ์ธ์ฆ์ url ๋ฆฌ๋ค์ด๋ ์ ์ผ๋ก ํ๋๊ฑฐ ์๋๊ฐ์? ์ฟ ํค๋ก ํ๋จํด์ ๋ก๊ทธ์ธํ๋ฉด ๊ด์ฐฎ์ต๋๋ค.
OAuht2 ์ค ์ผ๋ถ๋ url์ด ์๋ ์์ํ RESTFul ํ์์ธ access_token์ ํตํด ์ํ๋ฉ๋๋ค.
dva ๋ฐ Spring Boot Oauth2 ํตํฉ์ ์๊ฐ ์์ผ๋ฉด ๋ ์ข์ ๊ฒ์ ๋๋ค. D
@soulmachine ์ ๋ ์ด๊ฒ์ ์ฌ์ฉํ๊ณ ์๋๋ฐ ์๊ฐ์ด
@WhatAKitty ๋ access_token์ ์ ๋ฌํฉ๋๋ค. access_token์ ์ด๋์ ์ ์ฅ๋ฉ๋๊น? local/seesionStorage์ ์ ์ฅํ๋ฉด XSS ๋ณด์ ์ํ์ด ์์ต๋๋ค.
@u0x01 ์ .Access_token ์ ์๊ฐ ์ ํ์ด ์์ต๋๋ค.์๊ฐ ์ด๊ณผ ํ์๋ ๋ค์ ๋ก๊ทธ์ธํ ์ ์์ผ๋ฉฐ, refresh_token ๊ถํ์ด ์์ต๋๋ค. ๋๊ตฐ๋ค๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ณ ๋ค๋ฅธ ๊ด๋ จ ์ ๋ณด๋ฅผ ์กฐํํ์ฌ ๋ชจ๋ localstorage์ ์ ์ฅํฉ๋๋ค.
@WhatAKitty Now ํด์ปค๋ ์๋ํ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์์ฑํ์ฌ ๊ณต๊ฒฉํฉ๋๋ค. access_token์ ์ ํจ ๊ธฐ๊ฐ 2์๊ฐ์ด๋ฉด ๋ง์ ์ผ์ ํ ์ ์์ต๋๋ค. "๋ฆฌ์คํฌ๊ฐ ํฌ์ง ์๋ค"๋ ๊ฒฐ๋ก ์ ์ด๋ป๊ฒ
๋์งธ, refresh_token์ด localstorage์ ๋ฐฐ์น๋์ง ์์๋ฐ ์ด๋์ ๋๋์?
access_token์ APP์ ๋ ์ ํฉํฉ๋๋ค. ์์ JS ์ธก์์๋ access_token ์ฒด๊ณ๋ฅผ ์ฌ์ฉํ์ง ์์์ผ ํฉ๋๋ค. ์ฌ์ ํ ๊ต์ฐจ ์ฌ์ดํธ ๊ณต๊ฒฉ์ ์ํ์ด ์์ต๋๋ค.
ํ์ฌ ๊ฐ์ฅ ์์ ํ ์๋ฃจ์
์ set-cookie์ http-only๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค.
๋ก๊ทธ์ธ ํ์ธ ์ ์๋ฒ์ ์ฟ ํค๋ฅผ ๊ฐ์ ธ์ ์์ ์ํ๋ฅผ ๊ฐ์ ธ์ค๋ฉฐ ์คํจํ ๊ฒฝ์ฐ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฐ๋ก ์ด๋ํฉ๋๋ค.
์์ ์ ๋ํ ์์ฐ์ฑ์ด๋ฉฐ Taishan๋ณด๋ค ๋ ์ค์ํ๋ฏ๋ก ์ฌ๊ธฐ์์ ๊ฒ์ผ๋ฅด์ง ์์ ์ ์์ต๋๋ค.
@u0x01 refresh_token, js ํด๋ผ์ด์ธํธ์๋ ์ฃผ์ง ์๊ฒ ์ต๋๋ค. ๋ฐ๋ผ์ ๋ง๋ฃ๋๋ฉด ๋ค์ ์ธ์ฆ์ ๋ฐ์์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ค์๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ด์ ์ ๋ช
ํํํ์ง ์์์ ์ ์์ต๋๋ค. ๋น์ ์ ๋ํ๋์ง ์์ ๊ฒ์
๋๋ค.. ๋ค์ํ ์ํ์ด ์์ต๋๋ค.
๊ฐ์ฅ ์์ ํ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ณ ๋ คํ๋๋ฐ ํ๋: LOGIN PASSWORD๋ก ๋ก๊ทธ์ธํ ํ access_token์ ๋ฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ฅผ OAUTH2์ LOGIN PASSWORD์ ๋์์ ํธํ๋๋๋ก ํ์ง ์์์ต๋๋ค. , ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ง๋ง ์ฐพ์ง ๋ชปํ์ต๋๋ค. ๋์งธ: ํ๋ก์ ํธ์ ์๊ฐ ์๊ตฌ ์ฌํญ์ผ๋ก ์ธํด ์ด ์ต์
์ ์ ์ถฉ์์ผ๋ก๋ง ์ ํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๊ณํ์ ๋ค์ ๋ถ์ ์ ํด ๋ณด์ด์ง๋ง ์ฌ์ค ๋ณด์์์ ๋ฌธ์ ๋ ์์ ๊ฒ์
๋๋ค.
@WhatAKitty๋ SSL์ด "XSS/CSRF์ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์น์ฌ์ดํธ๋ฅผ ๋ณดํธํ ์ ์๋ค"๊ณ ๋ค์ด๋ณธ ์ ์ด ์์ผ๋ฉฐ ๋ ์ฌ์ด์๋ ์ง์ ์ ์ธ ๊ด๊ณ๊ฐ ์์ต๋๋ค.
์น ์ฌ์ดํธ ์์คํ
์ XSS/CSRF ์ทจ์ฝ์ ์ด 100% ์๋ค๊ณ ๋ณด์ฅํ ์ ์๋ค๋ฉด ์ด๋ฅผ localStorage์ ์ ์ฅํ๊ณ JS๊ฐ ์๊ฒฉ ์ฆ๋ช
์ ์ง์ ์ก์ธ์คํ๋๋ก ํ ์ ์์ต๋๋ค. (ํ์ง๋ง ์์คํ
์ ๋ณด์ ํ์ ์ด ์๋ค๊ณ ๊ฐํ ํฌํํ๋ ํ์ฌ๋ ๋ณธ ์ ์ด ์์ต๋๋ค.)
๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๊ฐ ์ธ์ฆํด์ผ ํ๋ ํน์ ๋ฆฌ์์ค์ ์ก์ธ์คํ๋ค๋ ๊ฒ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. OAuth2 ์ฌ์์์ access_token์ ์ป๋ ๊ฒ์ ์ฌ์ฉ์(๋๋ ๊ณต๊ธ์)๊ฐ ์ด ๊ถํ์ ์น์ธํ์์ ์๋ฏธํฉ๋๋ค.
๋ํ ๋ค์์ ์ธ๊ธํ์ต๋๋ค.
ๅ ไธบๆฒกๆณๅจไฝฟ็จ LOGIN PASSWORD ็ปๅฝๅ็ปๆ่ฟๅไธไธชaccess_token
OAUth2 ์ฌ์์ ๋ํ ์คํด์ ์๋ชป๋ ์ฌ์ฉ๋ฒ์
๋๋ค.
LOGIN PASSWORD ๋ฐฉ๋ฒ์ ๋ณธ์ง์ ์ผ๋ก UA๊ฐ OAUth2 ๊ณต๊ธ์์๊ฒ ์ง์ ์ธ์ฆ์ ์์ฒญํ๋ ํ๋ก์ธ์ค์
๋๋ค(RFC6749 ์ฐธ์กฐ) . ์ด๋, authorization_code๋ฅผ ํ๋ํด์ผ ํ๋ฉฐ, UA๊ฐ authorization_code๋ฅผ ํ๋ํ ํ OAUth2 Provider์ ์ ํจ์ฑ์ ํ์ธํ๊ธฐ ์ํด Client์๊ฒ ์ด๋ฅผ ์ ์กํ๊ฒ ๋๋ฉฐ, ๊ฒ์ฆ์ด ํต๊ณผ๋๋ฉด Client๋ OAUth2 Provider๋ก๋ถํฐ access_token์ ๋ฐ๊ฒ ๋ฉ๋๋ค. ์ด๋ Client๋ access_token์ ์ด์ฉํ์ฌ ์์์ ์ ๊ทผํ ์ ์๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋ผ์ด์ธํธ๋ UA์ SessionID๋ฅผ ๋ฐ๊ธํฉ๋๋ค.
(์ฌ๊ธฐ์ ํด๋ผ์ด์ธํธ๋ ์ต์ข
์ฌ์ฉ์๊ฐ ์๋ ๋น์ฆ๋์ค ๋น์ฌ์์ ์๋ฒ ๋๋ APP๋ฅผ ๋งํ๋ฉฐ ์ต์ข
์ฌ์ฉ์๋ ๋ฆฌ์์ค ์์ ์, UA๋ ๋ธ๋ผ์ฐ์ )
๋์ฒด๋ก SessionID๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํด์ผ ํฉ๋๋ค. SessionID๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ access_token์ http ์ ์ฉ ์ฟ ํค์ ๋ฃ์ด์ผ ํฉ๋๋ค.
1. Don't use local storage for session identifiers. Stick with cookies and use the HTTPOnly and Secure flags.
2. If cookies won't work for some reason, then use session storage which will be cleared when the user closes the browser window.
3. Be cautious with storing sensitive data in local storage. Just like any other client side storage options this data can be viewed and modified by the user.
์ค์ ๋ก access_token์ ํด๋ผ์ด์ธํธ์ ๋ ธ์ถํ๋ ค๋ ๊ฒฝ์ฐ ์ ์ถฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// GET /seesion
access_token := ctx.Session().GetString("access_token")
if access_token != "" {
ctx.JSON(200, {"signed": true, "access_token": access_token})
} else {
ctx.Redirect("//yoursite.com/login")
}
๊ทธ๋ฌ๋ ๋๋ ์ฌ์ ํ ๊ทธ๊ฒ์ ์ฟ ํค์๋ง ๋ฃ๋ ๊ฒ์ด ์ข์ต๋๋ค.JS๋ GET /seesion ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธํ๋์ง ํ์ธํฉ๋๋ค.๋ค๋ฅธ ๋ฆฌ์์ค๋ ํ์์ ๊ฐ์ด ์ก์ธ์คํฉ๋๋ค.์๋ฒ๋ access_token์ด ๋ง๋ฃ๋์์์ ๋ฐ๊ฒฌํ ํ ๋ฐ๋ก ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค. :
// GET /seesion
access_token := ctx.Session().GetString("access_token")
if signed != "" {
ctx.JSON(200, {"signed": true})
} else {
ctx.Redirect("//yoursite.com/login"๏ผ "you need login first.")
}
// GET /posts/:postid
access_token := ctx.Session().GetString("access_token")
if access_token != "" && isValidAccessToken(access_token) {
ctx.JSON(200, getPostWithAccessToken(access_token, postid))
} else {
ctx.Redirect("//yoursite.com/login"๏ผ "you need login first.")
}
๋ฌผ๋ก , ๊ทํ์ ์น์ฌ์ดํธ ์์คํ ์ ๊ณต๊ฒฉ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์ ๋ ์๋ฌด ๋ง๋ ํ์ง ์์์ต๋๋ค.
์ด๋ฐ ์ข
๋ฅ์ "๋ถ์ ์ ํด ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ์์ ์์ ๋ฌธ์ ๋ ์์ ๊ฒ"์ด๋ผ๊ณ ์๊ฐํ๋ฉด์ ์์ผ๋ก ๊ณ ์ฉ์ฃผ์๊ฒ ์ผ๋ง๋ ๋ง์ ์์ค์ ์ค์ง ๋ชจ๋ฆ
๋๋ค.
๊ธฐ์
์ ๋ณด ๋ณด์ ์ ์ถ ๋ชฉ๋ก
์ค์๊ฐ์ผ๋ก 100๋ง ๊ณ ๊ฐ ์ ๋ณด๊ฐ ํ๋ ค๋๊ฐ๋ค (์ด ํ์ฌ์ ์ ๋ณด๋ณด์ ์ ์ถ ๋ฌธ์ ๋ ์์ง๊น์ง ์์ ํ ํด๊ฒฐ๋์ง ์์๊ณ , ํ๋ก๋ํธ ๋ํธํ ๋ฑ ๋ค์์ ๋ํ ์ ์์๊ฑฐ๋ ์
์ฒด์์ ๊ธ์ง)
์ ๋ณด ๋ณด์์ ๊ฐ ๊ธธ์ด ๋ฉ๋๋ค.
@u0x01
์๊น ๋ต๋ณ๋๋ฆฐ ๋ด์ฉ์ ๋ง์๋๋ฆฌ์๋ฉด ๋ถ๋ช
ํํ ์ ์์ต๋๋ค.. access_token์ ํ๋ํ๋ ๊ณผ์ ์์ client_id์ client_secret(ํ์ํ์ง ์์ ์ ์์) ๋ฟ๋ง ์๋๋ผ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ ํ์ํฉ๋๋ค.
XSS/CSRF์ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์น์ฌ์ดํธ๋ฅผ ๋ณดํธํ ์ ์์ต๋๋ค.
CSRF๊ฐ ๋นํ์ฑํ๋์์ต๋๋ค. XSS์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ชจ๋ ์ฝํ ์ธ ๊ฐ ์๋์ผ๋ก ์ ์ก๋๊ณ ๋ถ๋ฒ์ ์ธ ํ๋๊ฐ ํํฐ๋ง๋ฉ๋๋ค. ๋๋ฝ์ด ์์ ์ ์์ง๋ง ์์ ํ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ ๋ณด ๋ณด์์ด ์ ๋์ ์ผ๋ก ์์ ํ ๊ฒ์ ์๋๋๋ค. Microsoft์ Apple๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋๋ ๋น์ ์ ๋ฏฟ์ง ์์ต๋๋ค. ์์คํ ์ 100% ์์ ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
SessionID๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ http only ์ฟ ํค์ access_token์ ๋ฃ์ด์ผ ํฉ๋๋ค.
Http๋ง ์ ๋์ ์ผ๋ก ์์ ํ ๊ฒ์ ์๋๋๋ค.
OAUth2 ์ฌ์์ ๋ํ ์คํด์ ์๋ชป๋ ์ฌ์ฉ๋ฒ์ ๋๋ค.
์๋ชป๋ ์ฌ์ฉ์ผ๋ก ๊ฐ์ฃผ๋๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ด ์์ฉ ํ๋ก๊ทธ๋จ์์ ์น์ธ ํ์ด์ง๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ํ ์น์ธ ํ์ด์ง๋ฅผ ์ป์ ๋ค์ ์ก์ธ์ค์ ๋์ํฉ๋๊น? ๋๋ฌด ๋ง์ ๋ฌธ์ ์ ๋๊น? ํ์ฌ๋ก์๋ ์์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ์ด ์์ ์ ์ํํ๋ ์น์ฌ์ดํธ๋ ์์ต๋๋ค.
๋ํ ๋ณธ์ธ์ ์๋ฒ๊ฐ OAuth2 ์ธ์ฆ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ด์์ ์ธ ์ธ์ฆ ๋ฐฉ์์ด ๋ง์ํ์ ๊ฒ๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ด ๋ธ๋ผ์ฐ์ ํด๋ผ์ด์ธํธ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํฉ๋๋ค. UA๊ฐ AS๋ฅผ ์์ฒญํ๊ณ AS๊ฐ ์ธ์ฆ๋์ง ์์ ๊ฒ์ ๋ฐ๊ฒฌํ๊ณ LOGIN์ผ๋ก ์ ํํ ๋ค์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ํ ์๋ฒ์ ์ก์ธ์คํ ์ ์๋ ๊ถํ์ ์ฑ๊ณต์ ์ผ๋ก ์ป์ต๋๋ค(์ด๋ access_token์ผ ์๋ ์๊ณ ) ๋ฆฌ์์ค ์๋น์ค ์ก์ธ์ค ๊ถํ์ ์ง์ ์ด ์ ์์), ๊ทธ๋ฌ๋ฉด ์ฌ์ฉ์๋ js ์ธก ๋ฆฌ์์ค ์๋ฒ์์ ์ง์ /๊ฐ์ ์ ์ผ๋ก(access_token) ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค.
์ฆ, ์ ์ด์์ ์ธ ์ธ์ฆ ๋ฐฉ๋ฒ์ ์์ฒด UA์ ๋ํ ๊ฒ์ธ๋ฐ, ์ 3์๋ผ๋ฉด ๋ง์ํ์ Authorize_code๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ์ ์๋ ๊ถํ ํ์ด์ง๋ฅผ ์ป์ด์ผ ํ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ์ด์์ ์ธ ์ธ์ฆ ๋ฐฉ๋ฒ์ด์ง๋ง ์ํ๊น๊ฒ๋ ์ ์์ค์ด ์ ํ๋์ด ์๊ณ Spring์ OAuth2๋ฅผ ํตํด ์ํ๋ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋ฏธ๋์ ๋น์ ์ ๊ณ ์ฉ์ฃผ์๊ฒ ์ผ๋ง๋ ๋ง์ ํผํด๋ฅผ ์ค์ง ๋ชจ๋ฆ ๋๋ค.
์ฐ์ ์ ํฌ ํ๋ก์ ํธ๊ฐ ๋งค์ฐ ์๊ธํ๊ณ ์ํคํ ์ฒ๊ฐ ์ต๊ทผ์์ผ ๋ฐ๋ผ ์ก์๋ค๋ ์ ์ ๋ง์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฌ๋ ์๊ฐ์ด ํ๋ฝํ์ง ์๋ ๋น์ ์ ์์ฌ๋ ๊ธฐ์ ๋ณด์์ ์ฌ์ํ๋ฉด์ ํด๋ผ์ด์ธํธ์ ํ๋ก์ ํธ๋ฅผ ๋๋๊ทธํ๋๋ก ํ์ฉํฉ๋๊น? ํ์ค์ ์ข ์ข ์์ธํฉ๋๋ค. ์์ฌ๋ ๊ณ ๊ฐ์ ์์ ์ ์ ํ ๊ด์ฌ์ด ์์ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ์ด์ต์ ๋ ๊ด์ฌ์ด ์์ต๋๋ค. ๋ด๊ฐ ํ ์ ์๋ ์ ์ผํ ์ผ์ ๊ฐ๋ฅํ ํ ๋ง์ ์์ ์ ๋ณด์ฅํ๋ ๊ฒ๋ฟ์ ๋๋ค.
@u0x01 ์ฌ์ค ์ ๋ ์ ๊ฐ ์ค๊ณํ ์ํคํ ์ฒ๋ฅผ ๋ณด์ ๋ฌธ์ ์์ด ๋ง๋ค๊ณ ์ถ์ง๋ง ํ์ค์
์ง๊ธ๊น์ง ๋ด ๋ชจ๋ ๊ธฐ์ ์ ์ง๋ ์์ด ํ ์ฌ๋์ด ํ์ํ๋๋ฐ, ์ผ๋ถ ๋ถ์กฑํ ์๋ฃจ์ ์ ์ฌ์ค ๋ด ๋จ์ ์ ๋๋ค.
@WhatAKitty
๋น์ ์ ํ๋ก์ ํธ๋ ๋ฐ์๊ณ ์์ฌ๋ ์ ๊ฒฝ ์ฐ์ง ์์ผ๋ ์ง๊ธ ๋น์ ์ ์์ด๋์ด์ ๋ฐ๋ผ ํ์ธ์.
ํ์ง๋ง ์์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ถํ ํ์ด์ง๋ฅผ ์์ฒญํ ์ ์์ต๋๊น?์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ํ ๊ถํ ํ์ด์ง๋ฅผ ์ป์ ๋ค์ ์ก์ธ์ค์ ๋์ํฉ๋๊น? ๋๋ฌด ๋ง์ ๋ฌธ์ ์ ๋๊น? ํ์ฌ๋ก์๋ ์์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ์ด ์์ ์ ์ํํ๋ ์น์ฌ์ดํธ๋ ์์ต๋๋ค.
OAuth2์ ๊ด๋ จ ์ฌ์์ ์ฐธ์กฐํ์ญ์์ค. OAuth2๋ ๋ฌต์์ ๊ถํ์ ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ฆ, ์ ์ด์์ ์ธ ์ธ์ฆ ๋ฐฉ๋ฒ์ ์์ฒด UA์ ๋ํ ๊ฒ์ธ๋ฐ, ์ 3์๋ผ๋ฉด ๋ง์ํ์ Authorize_code๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ์ ์๋ ๊ถํ ํ์ด์ง๋ฅผ ์ป์ด์ผ ํ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
OAuth2๋ ์ 3์ ๊ฐ๋ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฒ๋ค๊ฐ CSRF ๋ณดํธ ๊ธฐ๋ฅ์ด ๋นํ์ฑํ๋ ์ํ์์ ๋ฌด์์ ํ๊ณ ์๋ ๊ฑด๊ฐ์... ์ค์ค๋ก ๊ตฌ๋ฉ์ ํ๊ณ ์๋ ๊ฒ ์๋๋๊น?
http only๊ฐ ์ ๋์ ์ผ๋ก ์์ ํ๋ค๋ ๋ง์ ํ์ง ์์์ง๋ง, http๊ฐ ํด๊ฒฐํ ์ ์๋ ์ฃผ์ ๋ณด์ ๋ฌธ์ ๋ js๊ฐ ์ฟ ํค๋ฅผ ์ฝ์ง ๋ชปํ๋๋ก ํ๋ ๊ฒ์
๋๋ค. SSL๊ณผ ํ๋ ฅํ๋ฉด ์ 3์๊ฐ ์ฟ ํค๋ฅผ ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค(์ค๊ฐ์ ๊ณต๊ฒฉ์ด ์๋ ๊ฒฝ์ฐ).
@WhatAKitty
์์ ์๋ ์ฌ์ฅ๋์ ์
์ฅ์์ ์ฐ๋๋ฐ, ์ฌ์ค ์์ ์์ ๋ฌธ์ ๊ฐ ์์ด์ ๋คํ์
๋๋ค. ํํธ์ผ๋ก๋ ์์ฌ๊ฐ ๋ณด์ ๋ฌธ์ ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ณ ๋ค๋ฅธ ํํธ์ผ๋ก๋ ์ ๋ณด ๋ณด์ ์์ง๋์ด์๊ฒ ์์ฌ๋ฅผ ๋จ๊ธธ ๊ฒ์
๋๋ค.
์ ๋ณด ๋ณด์ ์์ง๋์ด๋ ์๋์ ์ผ๋ก ๋ฒ๊ทธ๋ฅผ ๋จ๊ฒจ๋๋ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๊ฐ์ฌํด์ผ ํฉ๋๋ค. :)
@u0x01 OAuth2๋ฅผ ์ ์์๋ ๊ฒ ๊ฐ์๋ฐ์? ๊ทธ๋ฃน ์์ฑ์ด ๊ฐ๋ฅํ๊ฐ์?์ด ๋ถ์ผ์์ ์์ฉ ํ๋ก๊ทธ๋จ ์ ๋ณด๋ฅผ ๋ง์ด ์ฐพ์ง ๋ชปํ๊ณ ์์ง ํ ์๊ฐ์ด ์์์ต๋๋ค.๋ช ๊ฐ์ง ์ง๋ฌธ์ ํ ์ ์์ต๋๋ค.
@u0x01 ๋ฐฑ์๋๋ stateless์ด๊ณ ์ธ์ ์ด ์ ํ ์์ต๋๋ค. ํ ํฐ์ ์ฌ์ฉํ์ฌ ๋ง๋ฃ๋์๋์ง ํ์ธํ๋ ค๋ฉด redis๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.ํ ํฐ์ด ์์ ํ์ง ์ฌ์ญค๋ด๋ ๋ ๊น์?
@longzb stateless โ ์ธ์ ์์, ๋น์ ์ด ์ธ๊ธํ์ต๋๋ค
ํ ํฐ์ ์ฌ์ฉํ์ฌ ๋ง๋ฃ๋์๋์ง ์ฌ๋ถ๋ฅผ ๋ค์ ํ์ธํ์ญ์์ค.
์ค์ ๋ก access_token์ ์ธ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ธ์ ์ ์ ์์ ์๋ ๋ฐฉ์์ ๋ํด ํ์ตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ ํฐ์ ์ด๋์ ์์ ํ๊ฐ์?
http_only ์ฟ ํค์ ๋ฃ์ผ๋ฉด JS๊ฐ ์ฟ ํค๋ฅผ ์ง์ ํ๋ํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ผ๋ฏ๋ก XSS/CSRF ๊ณต๊ฒฉ์ ๊ฐ์น์ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์์ต๋๋ค.
@u0x01 ํ . ์ด์ ๋ฐ์ด๋์ ๋ค๋ ์์ต๋๋ค. ์ฟ ํค๋ฅผ ๋ฃ์๊ฑฐ์ผ, ๋ ์์ ํ๊ฒ ๋ซ์ง.
์ด ๊ธฐ์ฌ๋ ์์์ ๋ถ์์ ๋ํด ์ข์ต๋๋ค.
์ค๋์ SSM+ANTD ์ํ์ ๋ง๋ฌด๋ฆฌ ํ๊ณ ์๋๋ฐ, ์ด ๊ธ์ ์ฝ๊ณ ๊ฐ์ฅ ์์ ํ ๋ฐฉ๋ฒ์ ๋ฌต์์ โโ์๋ฒ๋ฅผ ์ด์ฉํ์ฌ ์ธ์ฆ ์๋ฒ๋ฅผ ์์ฒญํ๊ณ ํ ํฐ์ ์ป๊ณ , ๋ฌต์์ ์๋ฒ์ ์์ฒญํ์ฌ ํด๋น ์๋ฒ์ ์์์ ์ป๋ ๊ฒ์ด ๊ฐ์ฅ ์์ ํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฆฌ์์ค ์๋ฒ.
์ด ๊ธฐ์ฌ์์ ๋งํ๋ฏ์ด ํผ์ฑ๊ณผ ๊ฐ์ ์์์ ๊ถํ ๋ถ์ฌ๋ ์ํํ๊ธฐ ๋๋ฌธ์ ํด์ปค๊ฐ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ธฐ ์ํด ๋ณด์ ํด๋ผ์ด์ธํธ์ธ ์ฒํ๊ธฐ ์ฝ์ต๋๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ ค๋ฉด dva๊ฐ ์๋ฒ ์ธก ๋ ๋๋ง์ ์ง์ํด์ผ ํฉ๋๋ค. antd๊ฐ ์ง์ํ๋ฏ๋ก dva๊ฐ ์ด๋ฏธ ์ง์ํฉ๋๊น? @sorrycc
๋น์ ์ ์ณ์ ์ผ์ ๋ํด ๊ฑฑ์ ํ์ง ์์ต๋๋ค
ํด๋ผ์ด์ธํธ์ ์๋ ์ ๋ณด๋ฅผ ๋ณดํธํ์๊ฒ ์ต๋๊น?
์ ๋ณด๊ฐ ํด๋ผ์ด์ธํธ(์: ๋ธ๋ผ์ฐ์ )์ ๋๋ฌํ๋ฉด ์ ๋ณด๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ์๋ฌด ์กฐ์น๋ ์ทจํ ํ์๊ฐ ์์ต๋๋ค. ์ก์ธ์ค ํ ํฐ์ ์ฟ ํค, ์นํ์ด์ง์ ์จ๊ฒจ์ง ํ๋, html5 ๋ก์ปฌ ์บ์์ ์ ์ฅํ ์ ์์ต๋๋ค. ๋๋ ํ์ด์ง ์ค์์ ๋ฐ๋ก ํ์๋๋ฉฐ ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค(์๋ ์ํ ์ ์ธ...).
์ก์ธ์ค ํ ํฐ์ด ํด๋ผ์ด์ธํธ์ ์์ ๋ ๊ฑฑ์ ํ๋ ๊ฒ์ ๋ฉ๋ชจ์ฅ์ ์ด์ด ์ด๋ฉ์ผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ด ๋ค์ ๊ณต๊ฒฉ์๊ฐ ์๊ฒฉ ์์น์์ ํด๋น ์ ๋ณด๋ฅผ ํ์น ์ ์๋ค๊ณ ๊ฑฑ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ ์ผ์ ์ผ์ด๋์ง ์์ต๋๋ค. ์ปดํจํฐ๊ฐ ์ด๋ฏธ ์์๋์ง ์์ ํ ์ด ์์ ์์ ๋น์ ์ ์ด๋ฏธ ์์์ต๋๋ค.
๊ฑฑ์ ํ๋ ๊ฒ์ด ์ด๋ ์๋ฏธ๊ฐ ์์ต๋๊น?
์ผ๋ฐ์ ์ผ๋ก ๊ทํ์ ์ ๋ณด๋ ์ ์ก ์ค์ผ ๋ ์ทจ์ฝํฉ๋๋ค.OAuth2(์์์ ํ๋ฆ)์ ๊ฒฝ์ฐ ์ก์ธ์ค ํ ํฐ์ ๋ค์ ๋ ๊ณณ์์ ์ ์ก๋ฉ๋๋ค.
์ธ์ฆ ์๋ฒ์์ ๋ธ๋ผ์ฐ์ ๋ก
๋ธ๋ผ์ฐ์ ์์ ๋ฆฌ์์ค ์๋ฒ๋ก
์ ์ก ์ค์ ์ ๋ณด๋ฅผ ๋ณดํธํ๋ ๊ฒ์ ์ด๋์์๋ TLS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋งํผ ์ฝ์ต๋๋ค. OAuth2๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ ํ๋กํ ์ฝ์์ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ์ํํด์ผ ํฉ๋๋ค.์ด์ ์ง์ง ๋ฌธ์
OAuth2๋ฅผ ์ฌ์ฉํ๋ ค๋ ๋ฐฉ์์ OAuth2๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๋ฐฉ์์ด ์๋ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
OAuth2๋ฅผ ์ค์ฉํ๋ ์ด์ ๋ฅผ ์ดํดํ๋ ค๋ฉด ํ๋ฆ์ ๋ํด ์์์ผ ํฉ๋๋ค.
์ธ์ฆ ์ฝ๋(์ข์ ์ฝ๋์ง๋ง... ๊ณ์ ์ฝ์ผ์ธ์)
์์์ (์๋ชป๋ ๋ณด์ ๊ฐ๊ฐ)
๋ฆฌ์์ค ์์ ์ ์ํธ ์๊ฒฉ ์ฆ๋ช (๋์ฐํ ์๊ฐ)
ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช (๊ทํ์ ๊ฒฝ์ฐ์๋ ํด๋น๋์ง ์์)
์๋ฐ์คํฌ๋ฆฝํธ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ํ๋ ์ ์ผํ ํ๋ฆ์ ์์์ ํ๋ฆ์ด๋ฉฐ ์ด์ ๋ฌธ์ ๋ฅผ ์์ํฉ๋๋ค.์์์ ํ๋ฆ ๋ฌธ์
์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ง๋ง ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํฉ์๋ค. ์ก์ธ์ค ํ ํฐ์ ํน์ ํด๋ผ์ด์ธํธ์ ๋ฐ์ธ๋ฉ๋์ง ์์ต๋๋ค! ์ฌ์ ์น์ 10.16์์:
์์์ ํ๋ฆ์ ์ฌ์ฉํ๋ ๊ณต์ฉ ํด๋ผ์ด์ธํธ์ ๊ฒฝ์ฐ ์ด ์ฌ์์ ํด๋ผ์ด์ธํธ๊ฐ ์ก์ธ์ค ํ ํฐ์ด ๋ฐ๊ธ๋ ํด๋ผ์ด์ธํธ๋ฅผ ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๊ณต๊ฒฉ์๊ฐ ๋ฆฌ์์ค ์์ ์๋ก ๊ฐ์ฅํ ๋ค์ ๋ฆฌ์์ค ์๋ฒ์ ์ก์ธ์คํ ์ ์๋ ๋ฌธ์ด ์ด๋ฆฝ๋๋ค.์น์ 10.16์ ๊ณ์ ์ฝ์ด ๋ณด๊ฒ ์ต๋๋ค.๋ฆฌ์์ค ์์ ์๋ ๊ณต๊ฒฉ์์ ์ ์์ ์ธ ํด๋ผ์ด์ธํธ์ ์ก์ธ์ค ํ ํฐ์ ๋ถ์ฌํ์ฌ ๋ฆฌ์์ค์ ๋ํ ์ก์ธ์ค ๊ถํ์ ๊ธฐ๊บผ์ด ์์ํ ์ ์์ต๋๋ค. ์ด๋ ํผ์ฑ ๋๋ ๊ธฐํ ๊ตฌ์ค๋ก ์ธํ ๊ฒ์ผ ์ ์์ต๋๋ค. ๊ณต๊ฒฉ์๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ ํตํด ํ ํฐ์ ํ์น ์๋ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ณต๊ฒฉ์๋ ๋ค์์ ์๋ํ ์ ์์ต๋๋ค. ํฉ๋ฒ์ ์ธ ๊ณต๊ฐ ํด๋ผ์ด์ธํธ์ ์ก์ธ์ค ํ ํฐ์ ์ ๊ณตํ์ฌ ๋ฆฌ์์ค ์์ ์๋ฅผ ๊ฐ์ฅํฉ๋๋ค.
์์์ ํ๋ฆ(response_type=token)์์ ๊ณต๊ฒฉ์๋ ์ธ์ฆ ์๋ฒ์ ์๋ต์์ ํ ํฐ์ ์ฝ๊ฒ ์ ํํ์ฌ ์ค์ ์ก์ธ์ค ํ ํฐ์ ๊ณต๊ฒฉ์์๊ฒ ์ด์ ์ ๋ฐ๊ธ๋ ํ ํฐ์ผ๋ก ๊ต์ฒดํ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ์ ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ธฐ ์ํด ๋ฐฑ ์ฑ๋์์ ์ ๋ฌ๋ ์ก์ธ์ค ํ ํฐ์ ์์กดํ๋ ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํต์ ํ๋ ์๋ฒ๋ ์์์ ๋๋๋ ์ก์ธ์ค ํ ํฐ์ ์ฃผ์ ํ ์ ์๋ ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๋ ๊ณต๊ฒฉ์์ ์ํด ์ ์ฌํ๊ฒ ์์๋ ์ ์์ต๋๋ค.
๋ฆฌ์์ค ์์ ์๋ง ๋ฆฌ์์ค์ ๋ํ ์ ํจํ ์ก์ธ์ค ํ ํฐ์ ์ ๊ณตํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ ๋ชจ๋ ๊ณต๊ฐ ํด๋ผ์ด์ธํธ๋ ์ด๋ฌํ ์ ํ์ ๊ณต๊ฒฉ์ ์ทจ์ฝํฉ๋๋ค.
๊ทธ ์ฒซ ๋ฒ์งธ ๊ณต๊ฒฉ์ ์ค์ ๋ก ๊ณต๊ฒฉ๋ ์๋๊ณ ์คํ๋ ค ์์์ ํ๋ฆ์ "๊ฒฐํจ"์ผ ๋ฟ์ ๋๋ค...๋ค์ ๊ณต๊ฒฉ
์ด์ ํฐ ๋ฌธ์ ๊ฐ ์์๋ฉ๋๋ค. OAuth2 ์์์ ํ๋ฆ์ ์ ๊ณตํ์ง ์๋ ์์๋ ์ต์ข ์ฌ์ฉ์ ์ธ์ฆ ํ์์ผ๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ์ ์น์ ์ผ๋ก ๋์๊ฐ๊ธฐ 10.16
ํด๋ผ์ด์ธํธ์ ๋ํ ๋ฆฌ์์ค ์์ ์ ์ธ์ฆ์ ์ด ์ฌ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ๋ํ ์์๋ ์ต์ข ์ฌ์ฉ์ ์ธ์ฆ์ ํํ๋ก ๊ถํ ๋ถ์ฌ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๋ ์ฌ์(์: ํ์ฌ ๋ก๊ทธ์ธ ์๋น์ค)์ ๋ค์ ์์ด ์์์ ํ๋ฆ์ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค(MUST NOT). ํด๋ผ์ด์ธํธ๊ฐ ์ก์ธ์ค ํ ํฐ์ด ์ฌ์ฉ์ ์ํด ๋ฐํ๋์๋์ง ํ์ธํ ์ ์๋๋ก ํ๋ ์ถ๊ฐ ๋ณด์ ๋ฉ์ปค๋์ฆ(์: ์ก์ธ์ค ํ ํฐ์ ๋์์ผ๋ก ์ ํ).
์ด ์์ ์์ ๋๋ถ๋ถ์ ๊ฒ์์ ๋๋ฌ์ต๋๋ค.๊ทธ ๊ณต๊ฒฉ์ ๋ง์ดํธํ๋ ๋ฐฉ๋ฒ?
์์ฃผ ๊ฐ๋จํฉ๋๋ค. REST ์๋น์ค์ facebook์ ์ก์ธ์ค ํ ํฐ์ด ํ์ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ณต๊ฒฉ์๊ฐ ํด์ผ ํ ์ผ์ stackoverflow์ ๊ฐ์ ์๋น์ค๋ฅผ ํธ์คํ ํ๊ณ facebook์ ์ก์ธ์ค ํ ํฐ์ ์๊ตฌํ๋ ๊ฒ์ ๋๋ค. facebook ์ก์ธ์ค ํ ํฐ์ stackoverflow์ ์ ๊ณตํ๋ฉด stackoverflow(๊ณต๊ฒฉ์)๋ ์ด์ REST ์๋น์ค๋ก ์ฌ์ฉ์๋ฅผ ๊ฐ์ฅํ ์ ์์ต๋๋ค.
์ก์ธ์ค ํ ํฐ์ด ํน์ ํด๋ผ์ด์ธํธ์ ๋ฐ์ธ๋ฉ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฃจ์
์์์ ํ๋ฆ์ ์ฌ์ฉํ์ง ๋ง๊ณ ๋์ ์ธ์ฆ ์ฝ๋ ํ๋ฆ์ ์ฌ์ฉํ์ญ์์ค.์ฆ, 100% ํด๋ผ์ด์ธํธ ์ธก ์ฑ์ด ๋ ์ด์ 100% ํด๋ผ์ด์ธํธ ์ธก ์ฑ์ด ๋ ํ์๊ฐ ์์ต๋๋ค.
OAuth2 ํ๋ฆ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ์์๊ฒ angularjs ํด๋ผ์ด์ธํธ๋ฅผ ์ ๊ณตํ๋ ์๋ฒ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@WhatAKitty ๊ฐ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์ ํน์ ์๋ณ์๊ฐ ๊ณ ์ ํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์์ฒญ์ ๋ณด๋ผ ๋ ์ด ์๋ณ์๋ฅผ ์๋์ผ๋ก ๊ฐ์ ธ์ค๋ฉฐ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.๋ฐฑ์๋๋ ํ ํฐ์ ์ฒ์ ์ ์ฒญํ ๋ ์ด ์๋ณ์์ ํ ํฐ์ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค. ๋ค์ ์์ฒญ์ด ํ ํฐ์ ์ ์ฅ๋ ๋ธ๋ผ์ฐ์ ID์ ์ผ์นํ์ง ์์ผ๋ฉด ๋ถ๋ฒ ์์ฒญ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. .
๊ทธ๋์ ๋ฌป๊ณ ์ถ์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญํ ๋ ๊ทธ๋ฌํ ๋ก๊ณ ๊ฐ ์์ต๋๊น? ?
@longzb๋ ์ผ๋ฐ์ ์ผ๋ก JSESSIONID๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.์๋ฅผ ๋ค์ด oschina๋ ์์ ์ id๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@WhatAKitty @soulmachine @longzb
OAuth2.0์ Password์ Client ๋ชจ๋๋ฅผ ๋์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐฑ์๋ ์๋ฒ์ ์ํธ๋ฆฌ ํ๋ก์๋ฅผ ์ถ๊ฐํ์ฌ access_token์ ์ ์ฅํ ์ ์์ผ๋ฉฐ, ์ด ํ๋ก์๋ฅผ ํ๋ฐํธ์๋ CORS(Spring Boot Oauth2๋ CORS์ ํ๋ฆฌํ๋ผ์ดํธ๋ฅผ ๊ฐ๋ก์ฑ๋ ๊ฒ ๊ฐ์ต๋๋ค)
ํ๋ก ํธ์๋ ๋น๋ฐ๋ฒํธ ๋ชจ๋๋ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ง ์์ด์ ํธ์๊ฒ ์ ์กํ๋ฉด ๋ฉ๋๋ค. ์์ด์ ํธ๋ ๊ถํ์ ๋ถ์ฌ๋ฐ๊ณ access_token์ ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ด์ ํธ๊ฐ ์์ฑํ SESSION_ID๊ฐ ํ๋ก ํธ์๋๋ก ๋ฐํ๋๊ณ ์์ด์ ํธ๋ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. access_token์ ๋ง๋ฃ ๋ฐ ์๋ก๊ณ ์นจ ํ๋ก ํธ์๋์ ๋
ธ์ถ๋๋ ์ ์ผํ ๊ฒ์ Remember- Me ๋ฑ์ด Set-Cookie: Expires=
์ ํค๋์์ ๋ค๋ฅผ ๋ฟ์
๋๋ค.
ํด๋ผ์ด์ธํธ์ ํด๋ผ์ด์ธํธ ๋ชจ๋๋ ํ๋ก์์๋ง ์ก์ธ์คํ ํ์๊ฐ ์์ผ๋ฉฐ ์ธ์ฆ์ ๋ฐ๊ธฐ ์ํด OAuth ์ธํฐํ์ด์ค๋ก ์ง์ ์ด๋ํฉ๋๋ค.
@u0x01๋ ๋ต๊ธ์ ์ ๊ฐ
์ค์ ๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฝํ ์ ์์ต๋๋ค.
access_token์ Session ๋์ ํ๋ก ํธ ์๋์ ์ง์ ๋์ง๋ ๊ฒ์ ํด๋ผ์ด์ธํธ ๋ชจ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ณต์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ข ๋ฅ์ ์ธํฐํ์ด์ค๋ ์ข ์ข Session ๊ฒ์ฆ์ ์ง์ํ์ง ์๊ฑฐ๋ ๋ถ์ฐ ์์คํ ์์ Session์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ถํธํฉ๋๋ค.
XSS ๋ฐ CSRF ๊ณต๊ฒฉ์ ๋ํ ๋ณด์์ ๋ณ๋๋ก ๋ถ์ํด์ผ ํฉ๋๋ค.
2.1 CSRF๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๋ก ํธ์๋๋ ๋ณด๋ผ HTTP ํค๋์ access_token์ ๋ฃ๊ณ ๋ฐฑ์๋๋ ํค๋ ๊ฒ์ฆ๋ง ์ง์ํจ๊ณผ ๋์์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ค๊ณํ๋ฉด ๋๋ค. ์ 3์ ์น์ฌ์ดํธ๋ ํผ์ ํตํด์๋ง ์ถ๊ฐ HTTP ํค๋๋ฅผ ๋ณด๋ผ ์ ์๊ณ , ์ 3์ ์น์ฌ์ดํธ์ JS๋ ์์ฒด ์น์ฌ์ดํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๊ธฐ ๋๋ฌธ์(CORS๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋ ๊ฒฝ์ฐ)
XSS ๋ฐฉ์ง 2.2 ํ๋ก ํธ ์๋ ์ ์ฅ access_token์ ์ค์ ๋ก ๋ถ์์ ๋ง์๋๋ก JS์ ์ํด ํ๋
์์ญ์ ํตํด ์ ์ก ๋ ์ ์์ผ๋ฉฐ, ๋ฐ ์ฟ ํค HttpOnly
. ์๊ฒฉ ์ฆ๋ช
์๋ฃ ์ต์ ๋ธ๋ผ์ฐ์ ธ ๋งค์ฐ ๋๋ฉ์ธ ๊ฐ ์ ํ์ด ์ ํ๋๋ ์งํฉ ์๋ฐํ ๋งํ๋ฉด ์ป์ ์ ์๋ ๋ฐฉ๋ฒ์ด ๊ฑฐ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ต์ข
๋ถ์์์ XSS๋ฅผ ๋ฐฉ์งํ๋ค๋ ๊ฒ์ ์คํฌ๋ฆฝํธ ์ฃผ์
์ ๋ฐฉ์งํ๊ณ ์ ๋ขฐํ ์ ์๋ ์ธ๋ถ ์คํฌ๋ฆฝํธ๋ฅผ ์ธ์ฉํ์ง ์๋ ๊ฒ์ ์๋ฏธํด์ผ ํ์ง ์์ต๋๊น?์ด HttpOnly
๋ ๊ตฌ์ ์๋จ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค
๊ฐ์ฅ ์์ ํ ๋ฐฉ๋ฒ์ ๋ฐฑ์๋์์ ์์ ํ๋ก์ ์ญํ ์ ํ๊ณ CORS์ Access-Control-Allow-Origin
๋ฅผ ์ค์ ํ์ฌ ํ๋ก ํธ์๋ ๋๋ฉ์ธ ์ด๋ฆ๋ง ํ์ฉํ๋๋ก ์ค์ ํ๋ ๊ฒ์
๋๋ค. ์ฌ์ฉ์๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ก๊ทธ์ธํ๋ฉด HttpOnly
์ ์ธ์
์ด ๋ฐํ๋๊ณ ํค๋ ํ๋์ X-CSRF-TOKEN
์ ๊ฐ์ ์์์ ์ฝ๋๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.์ด ์์์ ์ฝ๋๋ OAuth ์ธํฐํ์ด์ค์์ ์ป์ access_token๊ณผ ํจ๊ป ์กด์ฌํฉ๋๋ค. . ํ๋ก ํธ์๋๋ Ajax๋ fetch๋ฅผ ์ฌ์ฉํ์ฌ Cookie์ ์ด ํค๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ , ๋ฐฑ์๋๋ Cookie์ ์ ํจ์ฑ์ ๊ฒ์ฆํ ํ X-CSRF
ํค๋์ ์ ํจ์ฑ์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค.์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก CSRF ๋ฐ ์ผ๋ฐ XSS๊ฐ ๊ถํ์ ํ์น๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์์ปจ๋, access_token์ ํ๋ฐํธ ์๋ ๊ด๋ฆฌ๋ ๋ฌด๋กํ๊ฒ ์์ ํ์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค.
์ ๋ฐ์ดํธ 1:
๋ฏธ๋ค์จ์ด ๋๋ ๋ฐฑ์๋๋ jwt๋ฅผ ์ฌ์ฉํ์ฌ access_token์ ์ํธํํจ๊ณผ ๋์์ XSS๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฃผ์ ๊ฐ์ง ๋ฐ CSP๋ฅผ ํ์ฑํฉ๋๋ค.
@mdluo ๋ช ์พํ ์์ด๋์ด๊ฐ ์์ต๋๋ค, ์นญ์ฐฌํฉ๋๋ค ๐
@mdluo ์ฃ์กํฉ๋๋ค. ์ ๋ ํ๋ก ํธ ์๋์ ์ด๋ณด์์
๋๋ค. ์ธ๊ธํ ์ธ ๋ฒ์งธ ๋ฐฉ๋ฒ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก Spring boot + spring security๋ก ๋ฐฑ์๋ ๋ถ๋ถ์ ๋ฌ์ฑํ ์ ์์ง๋ง ํ๋ก ํธ ์๋ ํ์น์ ์ฟ ํค๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ํฌ๋ก์ค ๋๋ฉ์ธ์ ํฌํจํ๊ธฐ ๋๋ฌธ์ ์ธํฐ๋ท์ ์ผ๋ถ ์๋ฃจ์
์์๋ credentials: "include"
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์ง๋ง ์ด ๋งค๊ฐ๋ณ์๋ GET ์์ฒญ๋ง ํด๊ฒฐํ ์ ์์ต๋๋ค. POST ๋ฐ ๊ธฐํ ๋ฌธ์ ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฒ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ง์ ์์ฑํ๋ ๊ฒ์ ์ด๋ฆฌ์์ ์ผ์
๋๋ค. ํ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ๋ฐํธ ์๋: DVA ํฌํธ 8000
๋ฐฑ์๋: ์คํ๋ง ๋ถํธ + ์คํ๋ง ๋ณด์, X-CSRF-TOKEN ๋ฐ ์ฟ ํค
@yoster0520 ๋ฐฑ์๋์ CORS ์ค์ ํ๋ก ํธ์๋์ ์ฌ๋ฌ ์ฃผ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฐฑ์๋๋ ์ฟ ํค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ํ์ดํธ๋ฆฌ์คํธ์ ๋ฐ๋ผ Access-Control-Allow-Origin
๋ง ๋์ ์ผ๋ก ๊ฒฐ์ ํ์ฌ ๋ฐํํด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@u0x01๋ ๋ต๊ธ์ ์ ๊ฐ
์ค์ ๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฝํ ์ ์์ต๋๋ค.
access_token์ Session ๋์ ํ๋ก ํธ ์๋์ ์ง์ ๋์ง๋ ๊ฒ์ ํด๋ผ์ด์ธํธ ๋ชจ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ณต์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ข ๋ฅ์ ์ธํฐํ์ด์ค๋ ์ข ์ข Session ๊ฒ์ฆ์ ์ง์ํ์ง ์๊ฑฐ๋ ๋ถ์ฐ ์์คํ ์์ Session์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ถํธํฉ๋๋ค.
XSS ๋ฐ CSRF ๊ณต๊ฒฉ์ ๋ํ ๋ณด์์ ๋ณ๋๋ก ๋ถ์ํด์ผ ํฉ๋๋ค.
2.1 CSRF๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๋ก ํธ์๋๋ ๋ณด๋ผ HTTP ํค๋์ access_token์ ๋ฃ๊ณ ๋ฐฑ์๋๋ ํค๋ ๊ฒ์ฆ๋ง ์ง์ํจ๊ณผ ๋์์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ค๊ณํ๋ฉด ๋๋ค. ์ 3์ ์น์ฌ์ดํธ๋ ํผ์ ํตํด์๋ง ์ถ๊ฐ HTTP ํค๋๋ฅผ ๋ณด๋ผ ์ ์๊ณ , ์ 3์ ์น์ฌ์ดํธ์ JS๋ ์์ฒด ์น์ฌ์ดํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๊ธฐ ๋๋ฌธ์(CORS๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋ ๊ฒฝ์ฐ)
XSS ๋ฐฉ์ง 2.2 ํ๋ก ํธ ์๋ ์ ์ฅ access_token์ ์ค์ ๋ก ๋ถ์์ ๋ง์๋๋ก JS์ ์ํด ํ๋ ์์ญ์ ํตํด ์ ์ก ๋ ์ ์์ผ๋ฉฐ, ๋ฐ ์ฟ ํค
HttpOnly
. ์๊ฒฉ ์ฆ๋ช ์๋ฃ ์ต์ ๋ธ๋ผ์ฐ์ ธ ๋งค์ฐ ๋๋ฉ์ธ ๊ฐ ์ ํ์ด ์ ํ๋๋ ์งํฉ ์๋ฐํ ๋งํ๋ฉด ์ป์ ์ ์๋ ๋ฐฉ๋ฒ์ด ๊ฑฐ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ต์ข ๋ถ์์์ XSS๋ฅผ ๋ฐฉ์งํ๋ค๋ ๊ฒ์ ์คํฌ๋ฆฝํธ ์ฃผ์ ์ ๋ฐฉ์งํ๊ณ ์ ๋ขฐํ ์ ์๋ ์ธ๋ถ ์คํฌ๋ฆฝํธ๋ฅผ ์ธ์ฉํ์ง ์๋ ๊ฒ์ ์๋ฏธํด์ผ ํ์ง ์์ต๋๊น?์ดHttpOnly
๋ ๊ตฌ์ ์๋จ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค๊ฐ์ฅ ์์ ํ ๋ฐฉ๋ฒ์ ๋ฐฑ์๋์์ ์์ ํ๋ก์ ์ญํ ์ ํ๊ณ CORS์
Access-Control-Allow-Origin
๋ฅผ ์ค์ ํ์ฌ ํ๋ก ํธ์๋ ๋๋ฉ์ธ ์ด๋ฆ๋ง ํ์ฉํ๋๋ก ์ค์ ํ๋ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ก๊ทธ์ธํ๋ฉดHttpOnly
์ ์ธ์ ์ด ๋ฐํ๋๊ณ ํค๋ ํ๋์X-CSRF-TOKEN
์ ๊ฐ์ ์์์ ์ฝ๋๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.์ด ์์์ ์ฝ๋๋ OAuth ์ธํฐํ์ด์ค์์ ์ป์ access_token๊ณผ ํจ๊ป ์กด์ฌํฉ๋๋ค. . ํ๋ก ํธ์๋๋ Ajax๋ fetch๋ฅผ ์ฌ์ฉํ์ฌ Cookie์ ์ด ํค๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ , ๋ฐฑ์๋๋ Cookie์ ์ ํจ์ฑ์ ๊ฒ์ฆํ ํX-CSRF
ํค๋์ ์ ํจ์ฑ์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค.์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก CSRF ๋ฐ ์ผ๋ฐ XSS๊ฐ ๊ถํ์ ํ์น๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.์์ปจ๋, access_token์ ํ๋ฐํธ ์๋ ๊ด๋ฆฌ๋ ๋ฌด๋กํ๊ฒ ์์ ํ์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค.
์ ๋ฐ์ดํธ 1:
๋ฏธ๋ค์จ์ด ๋๋ ๋ฐฑ์๋๋ jwt๋ฅผ ์ฌ์ฉํ์ฌ access_token์ ์ํธํํจ๊ณผ ๋์์ XSS๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฃผ์ ๊ฐ์ง ๋ฐ CSP๋ฅผ ํ์ฑํฉ๋๋ค.