Skip to content

Latest commit

ย 

History

History
108 lines (78 loc) ยท 5.84 KB

File metadata and controls

108 lines (78 loc) ยท 5.84 KB

Cookie

์ฟ ํ‚ค๋ž€ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋œ ๋ชฉ์ ์œผ๋กœ ์ƒ์„ฑํ•œ key-value ํ˜•์‹์˜ ๋ฌธ์ž์—ด ๋ฉ์–ด๋ฆฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
HTTP๋Š” Stateless ๋ฌด์ƒํƒœ, Connectionless ๋น„์—ฐ๊ฒฐ์„ฑ์˜ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—, ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์„œ๋ฒ„๋Š” ์‘๋‹ต ํ—ค๋”์˜ Set-Cookie์— ์ •๋ณด๋ฅผ ๋‹ด๊ณ , ์ดํ›„ ํด๋ผ์ด์–ธํŠธ๋Š” ๋งค๋ฒˆ ์ €์žฅ๋œ ์ฟ ํ‚ค๋ฅผ ์š”์ฒญ ํ—ค๋”์— ๋‹ด์•„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
์„œ๋ฒ„๋Š” ์ฟ ํ‚ค์— ๋‹ด๊ธด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ˆ„๊ตฐ์ง€ ์‹๋ณ„ํ•˜๊ฑฐ๋‚˜ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ถ”์ฒœ ๊ด‘๊ณ ๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์‚ฌ์šฉ์ž์˜ ๊ณ ์œ  ์ •๋ณด ์œ ์ถœ ๋ฐ ์กฐ์ž‘ ์œ„ํ—˜์ด ์žˆ์–ด ๋ณด์•ˆ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ์šฉ๋Ÿ‰ ์ œํ•œ์ด ์žˆ๊ณ , ์›น ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ๊ณต์œ ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Session

์ฟ ํ‚ค์™€ ๊ฐ™์ด ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€๋งŒ,
๋‹ค๋ฅธ ์ ์€ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์„ธ์…˜ ID๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ฆ‰ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ ์„œ๋ฒ„ ์ธก์— ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์œ ์ €๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๋ฉด ์„ธ์…˜์ด ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ , ๋ถ€์—ฌ๋œ Session ID๋ฅผ ๋ธŒ๋ผ์šฐ์ € ์ฟ ํ‚ค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  Request์— Session ID๋ฅผ ์ฟ ํ‚ค์— ๋‹ด์•„ ์ „์†กํ•˜๊ณ , ์„œ๋ฒ„๋Š” ๊ทธ ๊ฐ’์„ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ Session ID์˜ ํƒˆ์ทจ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๋‚จ์•„์žˆ๊ณ ,
์„œ๋ฒ„์—์„œ ์„ธ์…˜ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์ด ๋งŽ์•„์ง€๋ฉด ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Token

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์ ‘์†ํ–ˆ์„ ๋•Œ ์ธ์ฆ๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ ํ† ํฐ์„ ๋ถ€์—ฌ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
์ด ํ† ํฐ์€ ์œ ์ผํ•œ ๊ฐ’์œผ๋กœ, ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ์€ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ,
ํ† ํฐ์€ ์ž์ฒด์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๊ณ  ์œ„์กฐ ํŒ๋ณ„๋งŒ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ๋œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹์€ ๋กœ๊ทธ์ธ ์‹œ ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์„œ๋ฒ„ ์ธก์—์„œ ํ† ํฐ์„ ๋ฐœ์ƒํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์ด ํ† ํฐ์„ ์ฟ ํ‚ค๋‚˜ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•œ ํ›„ HTTP ์š”์ฒญ ํ—ค๋”์— ํฌํ•จ์‹œ์ผœ ๋งค๋ฒˆ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์„œ๋ฒ„๋Š” ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ  ์š”์ฒญ์— ์‘๋‹ตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ํ† ํฐ ์ž์ฒด์— ์š”์ฒญํ•œ ์‚ฌ๋žŒ์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— DB๋ฅผ ์กฐํšŒํ•˜์ง€ ์•Š๊ณ ๋„ ์œ ์ €๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ† ํฐ์€ ๋ฐ์ดํ„ฐ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด, ์š”์ฒญ์ด ๋งŽ์•„์ง€๋ฉด ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ Payload ์ž์ฒด๋Š” ์•”ํ˜ธํ™”๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ €์˜ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
ํ† ํฐ ํƒˆ์ทจ ์œ„ํ—˜์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๊ธฐ๊ฐ„ ์ œํ•œ์„ ์„ค์ •ํ•˜๋Š” ์‹์œผ๋กœ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JWT (JSON Web Token)

JWT๋ž€ ์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์•”ํ˜ธํ™”์‹œํ‚จ JSON ํ† ํฐ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
JSON ๋ฐ์ดํ„ฐ๋ฅผ Base64 URL-safe Encode ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ง๋ ฌํ™”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์œ„๋ณ€์กฐ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๊ฐœ์ธํ‚ค ์ „์ž์„œ๋ช…๋„ ํฌํ•จ๋˜์–ด ์žˆ์–ด, ์„œ๋ฒ„์—์„œ๋Š” ์„œ๋ช…์„ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก Base64 URL-safe Encode
์ผ๋ฐ˜์ ์ธ Base64 Encode ์—์„œ URL ์—์„œ ์˜ค๋ฅ˜์—†์ด ์‚ฌ์šฉํ•˜๋„๋ก '+', '/' ๋ฅผ ๊ฐ๊ฐ '-', '_' ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

JWT๋Š” Header, Payload, Signature๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

Header

ํ—ค๋”์—๋Š” JWT์—์„œ ์‚ฌ์šฉํ•  ํƒ€์ž…๊ณผ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜๊ฐ€ ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "alg": "HS256", // ์„œ๋ช… ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ex. HMAC SHA256, RSA
  "typ": "JWT" // ํ† ํฐ ์œ ํ˜•
}

Payload

ํŽ˜์ด๋กœ๋“œ์—๋Š” ์„œ๋ฒ„์—์„œ ์ฒจ๋ถ€ํ•œ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.
์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๊ณ  ๋ฐ›๋Š” ์‹œ์Šคํ…œ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋  ์ •๋ณด์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

{
  "sub": "1234",
  "name": "JaeHui Kim",
  "iat": 1344534634
}

Signature

์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ถ€๋ถ„์—๋Š” Header, PayloadFmf Base64 URL-safe Encode๋ฅผ ํ•œ ์ดํ›„ Header์— ๋ช…์‹œ๋œ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ ,
๊ฐœ์ธํ‚ค Private key๋กœ ์„œ๋ช…ํ•œ ์ „์ž์„œ๋ช…์ด ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.

HMACSHA256(
  base54UrlEncode(header) + "." + base64UrlEncode(payload), 256-bit-secret-key
)

Spring Security

Spring Security๋ž€ Spring ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ, ํŠนํžˆ ์ธ์ฆ, ๊ถŒํ•œ, ์ธ๊ฐ€ ๋“ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ์Šคํ”„๋ง ํ•˜์œ„ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
Dispatcher Servlet ๊ฐ€๊ธฐ ์ „์— ๊ฐ€์žฅ ๋จผ์ € URL ์š”์ฒญ์„ ๋ฐ›๊ฒŒ ๋˜๋Š” Filter์—์„œ ์ธ์ฆ๊ณผ ๊ถŒํ•œ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ž์ฒด์ ์œผ๋กœ ๋ณด์•ˆ๊ณผ ๊ด€๋ จ๋œ ๋งŽ์€ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์ผ์ผ์ด ๊ด€๋ จ ๋กœ์ง์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์ธ์ฆ Authentication
ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ๋ณธ์ธ์ด ๋งž๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ

๐Ÿ’ก ์ธ๊ฐ€ Authorization
์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์ž์›์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ ˆ์ฐจ

์ฆ‰, ์ธ์ฆ -> ์„ฑ๊ณต -> ์ธ๊ฐ€ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.