2022.07.15(Fri)
[TIL] Day58
[SEB FE] Day57
โฐย Web application Security
: ๊ฐ๋ฐ์๋ค์ด ์น์ฌ์ดํธ, ๋ชจ๋ฐ์ผ ์ดํ, ์น API ๋ฑ์ ๋ง๋ค ๋ ํด์ปค๋ค์ ๊ณต๊ฒฉ์ ๋ง๊ธฐ ์ํ ๋ณด์(security) โ ํ์ ์ฌํญ!
: ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์์์ SQL๋ฌธ์ ์คํํ ์ ์๋๋ก ๋ช
๋ น์ด๋ฅผ ์ฝ์
ํ๋ ๊ณต๊ฒฉ ์ ํ
๐ย ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋น์ ์์ ์ผ๋ก ์กฐ์ํ๋ฏ๋ก ๊ธฐ๋ก ์ญ์ / ๋ฐ์ดํฐ ์ ์ถ ๊ฐ๋ฅ์ฑ โญ๏ธ
โฐย ๋์ ๋ฐฉ์
ํ์ดํธ๋ฆฌ์คํธ
: ๋ชจ๋ ๊ธฐ๋ณธ ์ ์ฑ
์ฐจ๋จ ์ํฉ์์ ์์ธ์ ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ ๋์์ ์ง์ ํ๋ ๋ฐฉ์ / ๊ทธ ์ง์ ๋ ๋์๋ค: ์น ์ฌ์ดํธ ๊ด๋ฆฌ์๊ฐ ์๋ ๊ณต๊ฒฉ์๊ฐ ์น ์ฌ์ดํธ์ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ด๋๋ ํ์
โฐย XSS ๊ณต๊ฒฉ ์ ํ
Stored XSS
= ์ง์์ (persistent) ๊ธฐ๋ฒ
: ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ์ ์ ์ฅ๋์ด ์ฌ๋ฌ ์ฌ์ฉ์์๊ฒ ํผํด๋ฅผ ์ค ์ ์๋ ์ ํReflected XSS
= ๋น์ง์์ (Non-persistent) ๊ธฐ๋ฒ
: URL ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ์ ํโฐย XSS ๋์ ๋ฐฉ์
<>
)๊ฐ ๊ธ์ ๊ทธ๋๋ก ์ ์ฅ๋์ง ์๊ฒ ๋ฐฉ์ง ๊ฐ๋ฅtextContent
์์ฑ์ ์ฌ์ฉํ์ฌ ํํฐ๋ง ๊ฐ๋ฅ<
โ <
, >
โ >
)httpOnly
): ๋ค๋ฅธ ์ฌ์ดํธ์์ ์ ์ ๊ฐ ๋ณด๋ด๋ ์์ฒญ(request) ์กฐ์
โฐ CSRF ๊ณต๊ฒฉ ํ๊ธฐ ์ํ ์กฐ๊ฑด
โฐ CSRF ๋์ ๋ฐฉ์
: ์ฌ์ฉ์๊ฐ ์๋ํ ํด๋ฆญ ๋์์ด ์๋ ๋ค๋ฅธ ๋์์ ํด๋ฆญํ๋๋ก ์์ด๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ
User Interface Redress
)โฐ Clickjacking ๋์ ๋ฐฉ์
<iframe>
๋ ๋๋ง ์ฌ๋ถ ์ ํ ๊ฐ๋ฅ: ํด๋ผ์ด์ธํธ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ณด๊ดํ๋ ๋ฐฉ๋ฒ
โย ํ ํฐ์ ์ ์ ์ ๋ณด๋ฅผ ์ํธํํ๋ฏ๋ก ํด๋ผ์ด์ธํธ์ ๋ด์ ์ ์์
โฐย JWT
(JSON Web Token
)
: JSON ํฌ๋งท์ผ๋ก ์ฌ์ฉ์์ ๋ํ ์์ฑ์ ์ ์ฅํ๋ ์น ํ ํฐ
Access Token
: ๋ณดํธ๋ ์ ๋ณด๋ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ๋ถ์ฌ์ ์ฌ์ฉ
Refresh Token
: ์ก์ธ์ค ํ ํฐ ์ ํจ๊ธฐ๊ฐ ๋ง๋ฃ์, ๋ฆฌํ๋ ์ ํ ํฐ์ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ก์ธ์ค ํ ํฐ ๋ฐ๊ธ
โฐย JWT ๊ตฌ์กฐ
Header
: ์ด๋ค ์ข
๋ฅ์ ํ ํฐ์ธ์ง, ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก Signature
๋ฅผ ์ํธํ(sign)ํ ์ง ์ ํ ์์
// JSON ํํ
{
"alg": "HS256", // ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก Signuture๋ฅผ ์ํธํํ๋์ง
"typ": "JWT" // ์ด๋ค ์ข
๋ฅ ํ ํฐ์ธ์ง
}
// ์ด JSON ๊ฐ์ฒด๋ฅผ base64๋ฐฉ์์ผ๋ก encoding
Payload
: ์๋ฒ์์ ํ์ฉํ ์ ์๋ ์ ์ ์ ๋ณด๊ฐ ๋ด๊น (Base64๋ก๋ง ์ธ์ฝ๋ฉ๋ ๊ฐ)
Signature
: Header, Payload๋ฅผ base64์ธ์ฝ๋ฉํ ๊ฐ & salt๊ฐ์ ์กฐํฉ์ผ๋ก ์ํธํ๋ ๊ฐ
โฐย ํ ํฐ๊ธฐ๋ฐ ์ธ์ฆ ์ ์ฐจ
Access/Refresh Token
๋ชจ๋ ์์ฑHTTP Header
/ Cookie
์ ํ ํฐ์ ๋ด์ ๋ณด๋Authorization Header
์ฌ์ฉ์ Bearer Authentication
์ด์ฉโฐย ํ ํฐ๊ธฐ๋ฐ ์ธ์ฆ ์ฅ์
: ์ธ์ฆ ์ค๊ฐ ๋งค์ปค๋์ฆ์ผ๋ก, ๋ณด์๋ ๋ฆฌ์์ค์ ์ก์ธ์คํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ์๊ฒ ๊ถํ(Authorization
)์ ์ ๊ณตํ๋ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ๋ ํ๋กํ ์ฝ
โย ์ธ์ฆ(Authentication
)์ ๋ค๋ฅธ ์๋น์ค์ ๋งก๊ธธ ๋ฟ, ์ ๊ทผ ๊ถํ ๊ด๋ฆฌ(Authorization
)๋ ์๋ฒ ๋ชซ!
Resource Owner
: ์ก์ธ์ค ์ค์ธ ๋ฆฌ์์ค์ UserClient
: ๋ฆฌ์์ค Owner๋ฅผ ๋์ ํ์ฌ ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ก์ธ์คํ๋ ์ ํ๋ฆฌ์ผ์ด์
Resource Server
: ํด๋ผ์ด์ธํธ ์์ฒญ์ ์๋ฝํ๊ณ ์๋ตํ ์ ์๋ ์๋ฒAuthorization Server
: Resource Server๊ฐ ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋ ์ธ์ฆ ์๋ฒAuthorization Grant
: ํด๋ผ์ด์ธํธ๊ฐ ์ก์ธ์ค ํ ํฐ์ ์ป๋ ๋ฐฉ๋ฒ ์๋ฏธ (์ฆ, ์๊ฒฉ ์ฆ๋ช
!)Authorization Code
: ์ก์ธ์ค ํ ํฐ ๋ฐ๊ธ์ ์ํ ์ฝ๋Access Token
: ๋ณดํธ ๋ฆฌ์์ค์ ์ก์ธ์คํ๋๋ฐ ์ฌ์ฉ๋๋ ์ธ์ฆ ํ ํฐ (credentials)Scope
: ํ ํฐ ๊ถํ ์ ์ / ์ฃผ์ด์ง ์ก์ธ์ค ํ ํฐ ์ฌ์ฉ โ ์ก์ธ์คํ ์ ์๋ ๋ฆฌ์์ค ๋ฒ์โ Grant type
: Client๊ฐ ์ก์ธ์ค ํ ํฐ์ ์ป๋ ๋ฐฉ๋ฒ
โฐ Authorization Code Grant type
: ๋จผ์ Authorization code๋ฅผ ๋ฐ์ ์ก์ธ์ค ํ ํฐ๊ณผ ๊ตํํ๋ ๋ฐฉ๋ฒ
โย Authorization code
์ ์ฐจ๋ฅผ ๊ฑฐ์น๋ ์ด์ ๋ ๋ณด์์ฑ ๊ฐํ์ ๋ชฉ์ ์ด ์์!
๐ย [Client] authorization code๋ง ๋ฐ์์ค๊ณ , [Server] Access Token ์์ฒญ ์งํ
โฐย Refresh Token Grant Type
: ์ผ์ ๊ธฐ๊ฐ ์ ํจ ์๊ฐ์ด ์ง๋์ ๋ง๋ฃ๋ ์ก์ธ์ค ํ ํฐ์ ํธ๋ฆฌํ๊ฒ ๋ค์ ๋ฐ์์ค๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
: ๋ก๊ทธ์ธ ์ํ ์ ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฐ๋จ ์น ์ฑ์ JWT๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํด๋ณด๊ธฐ ๐
๐พ ํ๋ฒ ๋ค์ ๊ณต๋ถํ๊ณ ๋ค์ ์
๋ก๋ํ๊ธฐ!~!
ํ ํฐ ๋ ์ด๋ ต๋ค,, ์์ง๋ ์ ๋๋ก ์ดํด ์์ค ๐ฅฒ