Dva: oauth2 ์ธ์ฆ ์ƒ˜ํ”Œ

์— ๋งŒ๋“  2016๋…„ 09์›” 05์ผ  ยท  26์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dvajs/dva

dva์˜ OAuth2 ์˜ˆ์ œ, ๋ชจ๋‹ฌ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•, ๊ถŒํ•œ ํ™•์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‚˜์š”?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@u0x01๋‹˜ ๋‹ต๊ธ€์— ์ œ๊ฐ€

์‹ค์ œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. access_token์„ Session ๋Œ€์‹  ํ”„๋ก ํŠธ ์—”๋“œ์— ์ง์ ‘ ๋˜์ง€๋Š” ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“œ์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ข…์ข… Session ๊ฒ€์ฆ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ Session์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค.

  2. XSS ๋ฐ CSRF ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋ณด์•ˆ์€ ๋ณ„๋„๋กœ ๋ถ„์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    2.1 CSRF๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ณด๋‚ผ HTTP ํ—ค๋”์— access_token์„ ๋„ฃ๊ณ  ๋ฐฑ์—”๋“œ๋Š” ํ—ค๋” ๊ฒ€์ฆ๋งŒ ์ง€์›ํ•จ๊ณผ ๋™์‹œ์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž˜ ์„ค๊ณ„ํ•˜๋ฉด ๋œ๋‹ค. ์ œ3์ž ์›น์‚ฌ์ดํŠธ๋Š” ํผ์„ ํ†ตํ•ด์„œ๋งŒ ์ถ”๊ฐ€ HTTP ํ—ค๋”๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†๊ณ , ์ œ3์ž ์›น์‚ฌ์ดํŠธ์˜ JS๋Š” ์ž์ฒด ์›น์‚ฌ์ดํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—(CORS๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋œ ๊ฒฝ์šฐ)

    XSS ๋ฐฉ์ง€ 2.2 ํ”„๋ก ํŠธ ์—”๋“œ ์ €์žฅ access_token์€ ์‹ค์ œ๋กœ ๋ถˆ์•ˆ์ „ ๋งˆ์Œ๋Œ€๋กœ JS์— ์˜ํ•ด ํŒ๋… ์˜์—ญ์„ ํ†ตํ•ด ์ „์†ก ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ ์ฟ ํ‚ค HttpOnly . ์ž๊ฒฉ ์ฆ๋ช… ์ž๋ฃŒ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ ธ ๋งค์šฐ ๋„๋ฉ”์ธ ๊ฐ„ ์ œํ•œ์ด ์ œํ•œ๋˜๋Š” ์ง‘ํ•ฉ ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์ข… ๋ถ„์„์—์„œ XSS๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ ์ฃผ์ž…์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ธ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?์ด HttpOnly ๋Š” ๊ตฌ์ œ ์ˆ˜๋‹จ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  3. ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ๋ฐฑ์—”๋“œ์—์„œ ์ˆ˜์‹  ํ”„๋ก์‹œ ์—ญํ• ์„ ํ•˜๊ณ  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๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  26 ๋Œ“๊ธ€

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 ์‚ฌ์‹ค ์ €๋„ ์ œ๊ฐ€ ์„ค๊ณ„ํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ณด์•ˆ ๋ฌธ์ œ ์—†์ด ๋งŒ๋“ค๊ณ  ์‹ถ์ง€๋งŒ ํ˜„์‹ค์€

  1. ์ œ ๊ฐœ์ธ์ ์ธ ๊ธฐ์ˆ  ์ˆ˜์ค€์œผ๋กœ๋Š” ์ด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ธฐ์ˆ  ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  2. ๋‚˜๋ฅผ ์•ˆ๋‚ดํ•ด์ค„ ์ง„์ •ํ•œ ๊ธฐ์ˆ  ์ „๋ฌธ๊ฐ€๊ฐ€ ๋ถ€์กฑํ•˜๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜๋ฅผ ์•ˆ๋‚ดํ•ด ์ค€๋‹ค๋ฉด ๋‚˜๋Š” ํ–‰๋ณตํ•  ๊ฒƒ ๊ฐ™๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋‚ด ๋ชจ๋“  ๊ธฐ์ˆ ์€ ์ง€๋„ ์—†์ด ํ•œ ์‚ฌ๋žŒ์ด ํƒ์ƒ‰ํ–ˆ๋Š”๋ฐ, ์ผ๋ถ€ ๋ถ€์กฑํ•œ ์†”๋ฃจ์…˜์€ ์‚ฌ์‹ค ๋‚ด ๋‹จ์ ์ž…๋‹ˆ๋‹ค.

@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 ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ฐธ์กฐ: http://tools.ietf.org/html/rfc6749

@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๋‹˜ ๋‹ต๊ธ€์— ์ œ๊ฐ€

์‹ค์ œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. access_token์„ Session ๋Œ€์‹  ํ”„๋ก ํŠธ ์—”๋“œ์— ์ง์ ‘ ๋˜์ง€๋Š” ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“œ์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ข…์ข… Session ๊ฒ€์ฆ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ Session์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค.

  2. XSS ๋ฐ CSRF ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋ณด์•ˆ์€ ๋ณ„๋„๋กœ ๋ถ„์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    2.1 CSRF๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ณด๋‚ผ HTTP ํ—ค๋”์— access_token์„ ๋„ฃ๊ณ  ๋ฐฑ์—”๋“œ๋Š” ํ—ค๋” ๊ฒ€์ฆ๋งŒ ์ง€์›ํ•จ๊ณผ ๋™์‹œ์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž˜ ์„ค๊ณ„ํ•˜๋ฉด ๋œ๋‹ค. ์ œ3์ž ์›น์‚ฌ์ดํŠธ๋Š” ํผ์„ ํ†ตํ•ด์„œ๋งŒ ์ถ”๊ฐ€ HTTP ํ—ค๋”๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†๊ณ , ์ œ3์ž ์›น์‚ฌ์ดํŠธ์˜ JS๋Š” ์ž์ฒด ์›น์‚ฌ์ดํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—(CORS๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋œ ๊ฒฝ์šฐ)

    XSS ๋ฐฉ์ง€ 2.2 ํ”„๋ก ํŠธ ์—”๋“œ ์ €์žฅ access_token์€ ์‹ค์ œ๋กœ ๋ถˆ์•ˆ์ „ ๋งˆ์Œ๋Œ€๋กœ JS์— ์˜ํ•ด ํŒ๋… ์˜์—ญ์„ ํ†ตํ•ด ์ „์†ก ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ ์ฟ ํ‚ค HttpOnly . ์ž๊ฒฉ ์ฆ๋ช… ์ž๋ฃŒ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ ธ ๋งค์šฐ ๋„๋ฉ”์ธ ๊ฐ„ ์ œํ•œ์ด ์ œํ•œ๋˜๋Š” ์ง‘ํ•ฉ ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์ข… ๋ถ„์„์—์„œ XSS๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ ์ฃผ์ž…์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ธ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?์ด HttpOnly ๋Š” ๊ตฌ์ œ ์ˆ˜๋‹จ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  3. ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ๋ฐฑ์—”๋“œ์—์„œ ์ˆ˜์‹  ํ”„๋ก์‹œ ์—ญํ• ์„ ํ•˜๊ณ  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 ๋งŒ ๋™์ ์œผ๋กœ ๊ฒฐ์ •ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰