[WEB] ์ธ์ฆ(Authentication) & ์ธ๊ฐ€(Authorization)๐Ÿ’ก

Inah-_-ยท2021๋…„ 3์›” 8์ผ
0

WEB

๋ชฉ๋ก ๋ณด๊ธฐ
5/10

์ค‘์š”์ค‘์š”์ค‘์š” x 100



์ธ์ฆ & ์ธ๊ฐ€

API์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ๊ตฌํ˜„๋˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋กœ,
Privateํ•œ API, Publicํ•œ API๋„ ๊ธฐ๋ณธ์ ์ธ ์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ฅผ ์š”๊ตฌํ•œ๋‹ค.
๋ชจ๋“  ์ธ์ฆ๊ณผ ์ธ๊ฐ€๋Š” bcrypt ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


์ธ์ฆ(Authentication)๐Ÿ’ก

์ธ์ฆ์€ ์œ ์ €์˜ identification์„ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ๋กœ
์‰ฝ๊ฒŒ๋งํ•ด ์œ ์ €์˜ ID์™€ PASSWORD๋ฅผ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ์ด๋‹ค.

๋กœ๊ทธ์ธ ์ ˆ์ฐจ

1. ์œ ์ € ์•„์ด๋””์™€ ๋น„๋ฒˆ ์ƒ์„ฑ (ํšŒ์›๊ฐ€์ž…)
2. ์œ ์ € ๋น„๋ฒˆ ์•”ํ˜ธํ™” ํ•ด์„œ DB์— ์ €์žฅ. save()
3. ์œ ์ € ๋กœ๊ทธ์ธ -> ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ 
4. ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ํ•œํ›„ ์•”ํ˜ธํ™”๋˜์„œ DB์— ์ €์ •๋œ ์œ ์ € ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋น„๊ต.
5. ์ผ์น˜ํ•˜๋ฉด ๋กœ๊ทธ์ธ ์„ฑ๊ณต
6. ๋กœ๊ทธ์ธ ์„ฑ๊ณตํ•˜๋ฉด `access token`์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†ก.
7. ์œ ์ €๋Š” ๋กœ๊ทธ์ธ ์„ฑ๊ณตํ›„ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” `access token`์„ ์ฒจ๋ถ€ํ•ด
request๋ฅผ ์„œ๋ฒ„์— ์ „์†กํ•จ์œผ๋กœ์„œ ๋งค๋ฒˆ ๋กœ๊ทธ์ธ ํ•ด๋„ ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

์ธ์ฆ์ด ์™œ ํ•„์š”ํ• ๊นŒ?

  • ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํŒ๋ณ„
  • ์–ด๋–ค ์„œ๋น„์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํŒ๋ณ„

์ธ์ฆ์— ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด

ID, Email PassWord ๋“ฑ๋“ฑ

Password๊ฐ€ ํŠนํžˆ ์•„์ฃผ์•„์ฃผ ์ค‘์š”ํ•˜๋ฉฐ, ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ๋ฒ•์— ์˜ํ•ด
'๋น„๋ฐ€๋ฒˆํ˜ธ, ๋ฐ”์ด์˜ค, ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ ๋“ฑ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๊ฐœ์ธ์ •๋ณด๊ฐ€ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š๊ณ  ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์— ์ €์žฅ๋˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†ก๋  ๊ฒฝ์šฐ ๋…ธ์ถœ ๋ฐ ์œ„ยท๋ณ€์กฐ ๋“ฑ์˜ ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ ์•”ํ˜ธํ™” ๋“ฑ์˜ ์•ˆ์ „ํ•œ ๋ณดํ˜ธ์กฐ์น˜๊ฐ€ ์ œ๊ณต๋˜์–ด์•ผ ํ•œ๋‹ค.'๋ผ๊ณ 
๋ช…์‹œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

๊ตญ๊ฐ€์—์„œ ๊ถŒ๊ณ ํ•˜๋Š” ์ƒ์šฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด ๊ฐœ์ธ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”ํ•ด์•ผ ํ•œ๋‹ค.

๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•(๋‹จ๋ฐฉํ–ฅ ํ•ด์‰ฌ)

์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” '๋น„๋ฐ€'๋ฒˆํ˜ธ์ธ ๋งŒํผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ €์žฅํ•ด์•ผํ•œ๋‹ค.
๊ทธ๋Ÿผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๊ฑด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?
๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”์—๋Š” '๋‹จ๋ฐฉํ–ฅ ํ•ด์‰ฌ ํ•จ์ˆ˜(one-way hash function)'๊ฐ€ ์“ฐ์ธ๋‹ค.

์ž…๋ ฅ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ €์žฅํ•˜๊ณ ,
์•”ํ˜ธํ™”๊ฐ€ ๋œ ๋ฉ”์‹œ์ง€๋Š” ์›๋ณธ์œผ๋กœ ๋Œ๋ฆด ์ˆ˜ ์—†์–ด ๋‹จ๋ฐฉํ–ฅ์„ฑ(one-way)๋ผ๊ณ  ํ•œ๋‹ค.

ex) ํ•œ ์‚ฌ์ดํŠธ์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žŠ์–ด๋ฒ„๋ ธ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„๋‹Œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฑธ ์ƒ๊ฐํ•˜๋ฉด ์‰ฌ์›€


๋งŒ์•ฝ 1234๋ฅผ SHA-256 ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ๊ฐ’์€
03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4์ด๋‹ค.

import hashlib

a = hashlib.sha256()
a.update(b"test password")
a.hexdigest()

a.hexdigest()

# output
03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4

๊ฒฐ๊ณผ๋งŒ ๋ด์„œ๋Š” ์™„๋ฒฝํ•œ ์•”ํ˜ธํ™”์ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ,
์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ 1234๋ฅผ ๋‹ค์‹œ ํ•ด์‹ฑํ•˜๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ’์ด ๋„์ถœ๋œ๋‹ค.

์ด์™€ ๊ฐ™์€ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“  ํ•ด์‹ฑ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํŒ๋งคํ•˜๋Š” ์„œ๋น„์Šค๋„ ์กด์žฌํ•œ๋‹ค. ๋ถ€๋“ค๋ถ€๋“ค




JSON WebToken(JWT)

signature = ์„œ๋ช…
๋‚ด๊ฐ€ ๋งŒ๋“ค์–ด์ค€ ๊ทธ ๊ฐ’์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •
ํ”„๋ก ํŠธ์—์„œ JWT๋ฅผ ๋ฐฑ์—”๋“œ API ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋ฉด ์ „์†ก๋ฐ›๋Š” JWT์˜ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•œ ํ›„์—๋Š” access token์ด๋ผ๊ณ  ํ•˜๋Š” ์•”ํ˜ธํ™”๋œ ์œ ์ € ์ •๋ณด๋ฅผ ์ฒจ๋ถ€ํ•ด์„œ request๋ฅผ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.
access token์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ ์ค‘ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๊ฐ€ JWT์ด๋‹ค.
JWT๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์œ ์ € ์ •๋ณด๋ฅผ ๋‹ด์Œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™” ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์— ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.


์œ ์ € ๋กœ๊ทธ์ธ -> access token -> ํ•ด๋‹น ์œ ์ €์˜ ์ •๋ณด

์œ ์ € ๋กœ๊ทธ์ธ

POST /auth HTTP/1.1
Host: localhost:5000
Content-Type: application/json

{
    "username": "joe",
    "password": "pass"
}

access token

HTTP/1.1 200 OK
Content-Type: application/json

{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E"
}

๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„์—์„œ๋Š” access token์„ ๋ณตํ˜ธํ™”ํ•ด์„œ ํ•ด๋‹น ์œ ์ € ์ •๋ณด๋ฅผ ์–ป๊ฒŒ๋œ๋‹ค.

# ์˜ˆ๋ฅผ ๋“ค์–ด access token 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.
KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E' ์„ ๋ณตํ˜ธํ™” ํ•˜๋ฉด,

{	
	user_id = 1
}

๊ฐ’์ด ๋‚˜์˜จ๋‹ค.



์ธ๊ฐ€(Authorization)๐Ÿ’ก

Authorization์€ ์œ ์ €๊ฐ€ ์š”์ฒญํ•˜๋Š” request๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š” ์œ ์ €์ธ๊ฐ€๋ฅผ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ ์ด๋‹ค.
stateless > ๋กœ๊ทธ์ธ ์š”์ฒญ๊ณผ ๋กœ๊ทธ์ธ ํ•œ ์œ ์ €๊ฐ€ ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์š”์ฒญ์€ ๋…๋ฆฝ์ ์ด๋‹ค.

access token์„ ํ†ตํ•ด ํ•ด๋‹น ์œ ์ € ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ์œผ๋กœ ํ•ด๋‹น ์œ ์ €๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”
๊ถŒํ•œ(permission)๋„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋งค http ์š”์ฒญ๋งˆ๋‹ค headers์— meta data๋กœ ์ž…๋ ฅ๋œ๋‹ค.

JSON Web Token(JWT = string) ํ™œ์šฉ

๊ธฐ์กด ๋ฐฉ์‹์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•œ JWT ๋กœ์ง ์„œ๋ฒ„์™€ ์„œ๋ฒ„๊ฐ„ ์‹œํฌ๋ฆฟํ‚ค๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

1. http ์š”์ฒญ(๋กœ๊ทธ์ธ)
2. ์œ ์ € ์ •๋ณด ํ™•์ธ ํ›„ ํ•ด๋‹น ์ •๋ณด์™€ ์„œ๋ฒ„์˜ SECRET KEYํ™œ์šฉํ•˜์—ฌ JWT์ƒ์„ฑ
3. ํ•ด๋‹น JWT ์ „์†ก
4. JWT๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ
5. JWT๋ฅผ ํฌํ•จํ•œ http ์š”์ฒญ
6. JWT์˜ Signature ๋ถ€๋ถ„์„ ํ™•์ธ ํ›„ ํ•ด๋‹น ์œ ์ € ์ •๋ณด ๊ฒŸ
7. HTTP ์‘๋‹ต






profile
Backend Developer

0๊ฐœ์˜ ๋Œ“๊ธ€