PoppyMail๐Ÿ“ฌ ๊ฐœ๋ฐœ์ผ์ง€

Sewonยท2021๋…„ 12์›” 5์ผ
1

Project-PoppyMail

๋ชฉ๋ก ๋ณด๊ธฐ
1/2
post-thumbnail

โœ”๏ธ๋ถ€์ œ : Simple JWT๋ฅผ ์‚ฌ์šฉํ•œ ๋กœ๊ทธ์ธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

๊ธฐ์กด์— PyJWT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋ฅผ Simple JWT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค.
๋จธ๋ฆฟ์†์—์„œ๋Š” ์›ํ• ํ•˜๊ฒŒ ๊ทธ๋ ค์ง€๋˜ ๊ทธ๋ฆผ์ด ์ง์ ‘ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•˜๊ณ , ํ•˜๋ฃจ์ข…์ผ ์ƒ๊ฐ์„ ํ•˜๋ฉฐ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

โœ”๏ธSimple JWT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์ด์œ 

๋งจ ์ฒ˜์Œ์—๋Š” JWT ์ƒ์„ฑ๋งŒ์„ ์ƒ๊ฐํ•˜์—ฌ PyJWT๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ PyJWT์˜ ๊ฒฝ์šฐ ์ •๋ง JWT ์ƒ์„ฑ๋งŒ์„ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—ฌ์„œ django-rest-framework์—์„œ JWT ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์กด์˜ ์ธ์ฆ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด์ค˜์•ผํ–ˆ๋‹ค. ์ฐพ์•„๋ณด๋‹ˆ Simple JWT๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์—ˆ๊ณ  ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฌธ์„œ์™€ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ django-rest-framework์—์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก JWT์™€ ์ธ์ฆ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ž‘์„ฑํ•ด์ค˜์„œ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜์—ˆ๋‹ค. ์ธ์ฆ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ์˜๋ฏธ์žˆ๊ฒ ์ง€๋งŒ ํ˜„ ์‹œ์ ์—์„œ๋Š” ๋นจ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— SimpleJWT๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

ํ•  ์ผ ๋น„๊ต
Simple JWT ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ : User ๋ชจ๋ธ ํ™•์žฅ(django.contrib.auth.models์˜ User ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉ) + ๋กœ๊ทธ์ธ ๋กœ์ง ์ฒ˜๋ฆฌ
PyJWT ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ : User ๋ชจ๋ธ ํ™•์žฅ(์œ„์™€ ๋™์ผ) + JWT ๊ด€๋ จ(create, refresh ๋“ฑ) + ๋กœ๊ทธ์ธ ๋กœ์ง ์ฒ˜๋ฆฌ + JWT ์ธ์ฆ ์ฒ˜๋ฆฌ
โžก๏ธ ๋”ฐ๋ผ์„œ Simple JWT๊ฐ€ ๋” ํšจ์œจ์ ์ž„

โœ”๏ธ๋กœ๊ทธ์ธ ๊ตฌ์„ฑ ํ๋ฆ„

ใ„ฑ. (ํ”„๋ก ํŠธ โ†’ ์„œ๋ฒ„) ํ”„๋ก ํŠธ์—์„œ ์นด์นด์˜ค์—๊ฒŒ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•œ access_token ์ „๋‹ฌํ•ด์คŒ
ใ„ด. (์„œ๋ฒ„ โ†’ ์นด์นด์˜ค) ์ „๋‹ฌ๋ฐ›์€ access_token์œผ๋กœ ์„œ๋ฒ„์—์„œ ์นด์นด์˜ค์— ์‚ฌ์šฉ์ž ์ •๋ณด POST ์š”์ฒญํ•จ
ใ„ท. (์นด์นด์˜ค โ†’ ์„œ๋ฒ„) ์นด์นด์˜ค๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋กœ ์šฐ๋ฆฌ DB์— ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ์œ ์ €์ธ์ง€ ์ฒดํฌ
ใ„ท-1. ์šฐ๋ฆฌ DB์— ๋“ฑ๋ก๋œ ์œ ์ €์ธ ๊ฒฝ์šฐ
ใ„ท-2. ์‹ ๊ทœ ์œ ์ €์ธ ๊ฒฝ์šฐ
โ†’ ์ „๋‹ฌ๋ฐ›์€ ์นด์นด์˜ค ํšŒ์›๋ฒˆํ˜ธ๋ฅผ username์œผ๋กœ, password๋Š” ์„œ๋ฒ„์—์„œ ์ž์ฒด ์„ค์ •ํ•˜์—ฌ User(auth.models) ๊ฐ์ฒด ์ƒ์„ฑ
ใ„น. (์„œ๋ฒ„ โ†’ ํ”„๋ก ํŠธ) Simple JWT์˜ ํ† ํฐ ์ƒ์„ฑ ๋กœ์ง์œผ๋กœ ์ƒ์„ฑ๋œ ํ† ํฐ์„ ํ”„๋ก ํŠธ์—๊ฒŒ ์ „๋‹ฌ
ใ„น-1. ์‹ ๊ทœ ์œ ์ €์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ์ •๋ณด ์ž…๋ ฅ๋ฐ›์•„ AppUser(User ๋ชจ๋ธ ํ™•์žฅํ•œ ๊ฒƒ) ๊ฐ์ฒด ์ƒ์„ฑ
ใ…. ๋กœ๊ทธ์ธ ์ตœ์ข… ์™„๋ฃŒ!

โœ”๏ธ๊ฐœ๋ฐœ ์ด์Šˆโญ๏ธ

์•„๋ž˜์˜ ์ด์Šˆ๋“ค์€ simple-jwt ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ทธ๋•Œ๊ทธ๋•Œ ์ƒ๊ธด ์ด์Šˆ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ž‘์„ฑํ•ด๋†“์€ ๊ฒƒ์ด์–ด์„œ ๊ฐœ๋ฐœ์˜ ํ๋ฆ„๊ณผ ๋™์ผํ•จ

#1 User ๋ชจ๋ธ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

simple-jwt ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” token ์ƒ์„ฑ ์‹œ django.auth.models์—์„œ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋Š” User๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ username, password์— ํ•ด๋‹นํ•˜๋Š” ์œ ์ €๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์„œ ํ† ํฐ์„ ์ œ๊ณตํ•ด์คŒ

# simple-jwt์˜ serializers.py
from django.contrib.auth import authenticate, get_user_model

class TokenObtainSerializer(serializers.Serializer):
    username_field = get_user_model().USERNAME_FIELD
    . . .

๋”ฐ๋ผ์„œ User ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ , ์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ๋Š” ์ถ”๊ฐ€๋กœ ์ €์žฅํ•ด์•ผํ•˜๋Š” ๊ฐ’๋“ค์ด ์กด์žฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— User ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ํ•ด์ค˜์•ผ ํ–ˆ์Œ
Django ๊ณต์‹๋ฌธ์„œ ๋ฅผ ๋ณด๋‹ˆ ์ธ์ฆ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์˜ ๊ฒฝ์šฐ
A. ๊ธฐ์กด์˜ User ๋ชจ๋ธ ํ™•์žฅ (์ฑ„ํƒ!)
B. ๊ธฐ์กด์˜ User ๋ชจ๋ธ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์•„์˜ˆ ๋‹ค๋ฅธ ๋ชจ๋ธ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ
2๊ฐ€์ง€ ๋ฐฉ์•ˆ์ด ์กด์žฌํ–ˆ๋Š”๋ฐ, simple-jwt ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ๊ธฐ์กด์˜ User ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— A ๋ฐฉ์•ˆ์„ ์ฑ„ํƒํ•จ

#2 ํ† ํฐ ์ƒ์„ฑ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€?

1. ์ƒํ™ฉ
์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ์นด์นด์˜ค ๋กœ๊ทธ์ธ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ username, password๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ตฌ์กฐ์˜€์Œ(์ฆ‰ ์นด์นด์˜ค๋กœ ๋กœ๊ทธ์ธํ•˜๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญํ•˜๋ฉด ๋ฐ”๋กœ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ตฌ์กฐ)
๋งŒ์•ฝ username, password๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ตฌ์กฐ์˜€๋‹ค๋ฉด, ๋ฐ”๋กœ simple-jwt ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” POST api/token/ ๋ฅผ ํ”„๋ก ํŠธ์—์„œ ์š”์ฒญํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—ˆ์Œ
ํ•˜์ง€๋งŒ ๋กœ๊ทธ์ธ ์š”์ฒญ ์‹œ DB์— ์‚ฌ์šฉ์ž ์ €์žฅ & ํ† ํฐ ์ƒ์„ฑ๊นŒ์ง€ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ† ํฐ ์ƒ์„ฑ ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผํ• ์ง€ ๊ณ ๋ฏผํ•จ

2. ํ•ด๊ฒฐ๋ฐฉ์•ˆ
์ƒ๊ฐ1) POST api/token/ ์„œ๋ฒ„์—์„œ ์ง์ ‘ ์š”์ฒญ
์ˆ˜ํ–‰ ๋ฐฉ๋ฒ• :
Requests ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•จ
post requests

# ํ† ํฐ ์ƒ์„ฑ (simple-jwt)
     def createJWT(self, user):
         url = 'https://poppymail.shop/api/token/'  
         payload = {'username': user.username, 'password': '{์ž„์˜์˜ ๊ฐ’}'}
         return requests.post(url, json=payload)

๊ฒฐ๋ก  :
๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” ์ •์ƒ์ ์œผ๋กœ ์ž˜ ์ž‘๋™๋˜์—ˆ์Œ
ํ•˜์ง€๋งŒ ๋ฐฐํฌ ํ›„ ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” timeout์ด ๋‚จ
(๊ด€๋ จ ๋‚ด์šฉ ํ™•์ธโžก๏ธPoppyMail ๊ฐœ๋ฐœ์ผ์ง€ - ๋ฐฐํฌ ํ›„ ํ…Œ์ŠคํŠธ)

์ƒ๊ฐ2) POST ์š”์ฒญํ•˜์ง€ ์•Š๊ณ , ํ† ํฐ ์ƒ์„ฑ ๋กœ์ง์œผ๋กœ ๋ฐ”๋กœ ์—ฐ๊ฒฐ (์ฑ„ํƒ!)
๊ด€๋ จ ๋‚ด์šฉ ํ™•์ธโžก๏ธPoppyMail ๊ฐœ๋ฐœ์ผ์ง€ - ๋ฐฐํฌ ํ›„ ํ…Œ์ŠคํŠธ

simple-jwt์˜ ํ† ํฐ ์ƒ์„ฑ ๋กœ์ง์— ๋Œ€ํ•œ github ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด์—ˆ์œผ๋ฏ€๋กœ, ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์˜€์Œ(import ํ–ˆ์œผ๋‹ˆ๊นŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•จ! - simple-jwt์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ˆ๊นŒ) / ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋‹ˆ(ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋“ฑ) ํ•„์š”ํ•  ๋•Œ ๊ทธ ๋ถ€๋ถ„์„ ์ง์ ‘ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„ ๋ฟŒ๋“ฏํ–ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์›๋ฆฌ๋ฅผ ์ž˜ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ์„ ๋Š๊ผˆ๋‹ค.

#3. ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ/ํƒˆํ‡ด ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€?

1. ์ƒํ™ฉ ๋ฐ ๊นจ๋‹ฌ์Œ
์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋จผ์ € ํฐ ํ‹€์„ ์žก๊ณ  ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ƒ๊ฐํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ์ง€๊ธˆ ๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š” ์„ธ๋ถ€์‚ฌํ•ญ์ธ token ์ƒ์„ฑ๋ถ€ํ„ฐ ์ƒ๊ฐํ•˜๋‹ค๋ณด๋‹ˆ ์„ธ๋ถ€ โ†’ ํฐ ํ‹€์„ ์ƒ๊ฐํ•˜๋Š”๋ฐ์— ์—ฌ๋Ÿฌ์›€์ด ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Œ. ์ฆ‰ ํฐ ํ‹€์ธ ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ/ํƒˆํ‡ด ๊ตฌํ˜„ ๋ฐฉ์•ˆ์„ ์žก๊ณ  ๊ทธ ์„ธ๋ถ€์‚ฌํ•ญ์—์„œ token ์ธ์ฆ ๋ฐฉ์‹์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—ˆ์Œ

2. ํ•ด๊ฒฐ ๋ฐฉ์•ˆ
์ƒ๊ฐ1) dj-rest-auth ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ docs
์žฅ์  :
โ†’ User ๋“ฑ๋ก, ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ, User model ๋ฐ˜ํ™˜ ๋ฐ ์—…๋ฐ์ดํŠธ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, e-mail๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ์†Œ์…œ ๋กœ๊ทธ์ธ ์ธ์ฆ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต
๋‹จ์  :
โ†’ ์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ๋กœ๊ทธ์ธ์€ Id, PW ์ž…๋ ฅ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ฏ€๋กœ ๊ธฐ์กด์— ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ ํ•จ
โ†’ ์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์— ๋น„ํ•ด ๊ณผ๋„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์คŒ
๋”ฐ๋ผ์„œ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฝ”๋“œ๋Š” ์†Œ์…œ๋กœ๊ทธ์ธ(์ธ์ฆ์ฝ”๋“œ ์–ป๊ธฐ๋ถ€ํ„ฐ), ๊ธฐ์กด ๋กœ๊ทธ์ธ์— ๋Œ€ํ•œ ๋กœ์ง์ด ์™„๋ฒฝํ•˜๊ฒŒ ์งœ์—ฌ์žˆ์œผ๋ฏ€๋กœ ์ค‘๊ฐ„์— ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋Š” ๊ฒฐ์ •์„ ๋‚ด๋ฆผ

์ƒ๊ฐ2) ์ง์ ‘ ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ/ํƒˆํ‡ด ๋กœ์ง ๊ตฌํ˜„ํ•˜๊ธฐ (์ฑ„ํƒ!)
๋กœ๊ทธ์•„์›ƒ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ƒฅ ํ† ํฐ ์ฒ˜๋ฆฌ๋งŒ ํ•ด์ฃผ๋ฉด ๋˜๊ณ , ํƒˆํ‡ด์˜ ๊ฒฝ์šฐ User ๋ชจ๋ธ๋งŒ ์‚ญ์ œํ•ด์ฃผ๋ฉด ๋จ

class LoginView(APIView):  # ๋กœ๊ทธ์ธ
    permission_classes = [AllowAny]

    # ์นด์นด์˜คํ†ก์— ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ
    def getUserFromKakao(self, request):
        

    # DB์— ์žˆ๋Š”์ง€ ํŒ๋ณ„ (auth_user)
    def checkUserInDB(self, kakao_user):


    # simple-JWT์„ ์‚ฌ์šฉํ•ด ํ† ํฐ ์ƒ์„ฑ ํ•ด์ฃผ๋Š” ์—ญํ•  ์ˆ˜ํ–‰
    def createJWT(self, user):
       

    def post(self, request):
        

class AddUserInfoView(UpdateAPIView):  # ์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”๊ฐ€ ์ž…๋ ฅ(์—…๋ฐ์ดํŠธ)
    # ์ธ์ฆ & ํ—ˆ๊ฐ€ - JWTAuthentication, IsAuthenticated (๊ธฐ๋ณธ ์„ค์ •)

class LogoutView(APIView):  # ๋กœ๊ทธ์•„์›ƒ
    # ์ธ์ฆ & ํ—ˆ๊ฐ€ - JWTAuthentication, IsAuthenticated (๊ธฐ๋ณธ ์„ค์ •)

class SignoutView(DestroyAPIView):  # ํƒˆํ‡ด
    # auth_user ์‚ญ์ œํ•˜๋ฉด -> AppUser, OutstandingToken, BlacklistedToken๋„ ์‚ญ์ œ๋จ (์„œ๋กœ cascade๋กœ ์„ค์ •๋˜์–ด ์žˆ์Œ)
    # ์ธ์ฆ & ํ—ˆ๊ฐ€ - JWTAuthentication, IsAuthenticated (๊ธฐ๋ณธ ์„ค์ •)

์œ„์˜ ์ฝ”๋“œ ๊ตฌ์กฐ๋กœ views.py๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ฒ˜๋ฆฌํ•จ

#4 ์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”๊ฐ€ ์ž…๋ ฅ ์™„๋ฃŒํ•˜๊ณ  ํŽ˜์ด์ง€ ๋’ค๋กœ๊ฐ€๊ธฐ์—์„œ ๋˜ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ

1. ์ƒํ™ฉ
์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ์ž ์ตœ์ดˆ ๋กœ๊ทธ์ธ ์‹œ ์ถ”๊ฐ€๋กœ ํšŒ์› ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•จ
์ด๋•Œ ์›น ํŽ˜์ด์ง€์ด๋‹ค๋ณด๋‹ˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ถ”๊ฐ€ ์ž…๋ ฅ ์™„๋ฃŒํ•˜๊ณ  ๋’ค๋กœ ๊ฐ€๊ธฐ ๋ˆŒ๋Ÿฌ์„œ ๋‹ค์‹œ ํšŒ์› ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

2. ํ•ด๊ฒฐ๋ฐฉ์•ˆ

์ƒ๊ฐ) PATCH๋กœ ์„ค์ •ํ•˜๊ธฐ (์ฑ„ํƒ!)
์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”๊ฐ€ ์ €์žฅ์ด๋ผ๋Š” ์ƒ๊ฐ์— ์‚ฌ๋กœ์žกํ˜€ ์ฒ˜์Œ์—๋Š” POST๋กœ๋งŒ ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ, ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋ฏธ๋ฆฌ ํ•ด๋‹น ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด๋‘๊ณ  UPDATE๋กœ API ์„ค์ •์„ ํ•ด๋‘๋ฉด ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด์—ˆ์Œ
์ฆ‰ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ณ€๊ฒฝํ•œ๋Œ€๋กœ ์ €์žฅ๋˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค! ์ด๋•Œ PUT๊ณผ PATCH๊ฐ€ ์žˆ๋Š”๋ฐ ์›์น™์€ ์ „์ฒด ํ•ญ๋ชฉ์„ ๋ชจ๋‘ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ๋ถ€๋ถ„์ ์ธ ์—…๋ฐ์ดํŠธ๋กœ์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด PATCH๋กœ ์„ค์ •ํ•จ

#5 ์šฐ์ฒดํ†ต ๊ณ ์œ ํ‚ค ๊ฐ’ ํ•„๋“œ์— unique=True๋ฅผ ์„ค์ •ํ• ๊นŒ๋ง๊นŒ?

1. ์ƒํ™ฉ
์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ๋Š” ๊ฐœ์ธ๋งˆ๋‹ค ์ •ํ•ด์ง„ ์šฐ์ฒดํ†ต ๋งํฌ์— ์ ‘์†ํ•˜๋ฉด ์•„๋ฌด๋‚˜ ํŽธ์ง€๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•จ
์ด๋•Œ ์–ด๋–ค ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ url์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํŽธ์ง€์— ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ํŽธ์ง€๋ฅผ ์ž‘์„ฑํ•  ์ƒํ™ฉ์ด ๋ฒŒ์–ด์งˆ ์ˆ˜ ์žˆ์Œ
์‹ค์ œ๋กœ ์ต๋ช… ์งˆ๋ฌธ ์„œ๋น„์Šค์ธ Ask์˜ ๊ฒฝ์šฐ ask.kr/{์‚ฌ์šฉ์ž id} ํ˜•ํƒœ์˜ url์— ์ ‘์†ํ•˜๋ฉด ํ•ด๋‹น ์‚ฌ์šฉ์ž์—๊ฒŒ ์งˆ๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ € {์‚ฌ์šฉ์ž id}๋งŒ ๋ฐ”๊ฟ”์„œ ์š”์ฒญํ•˜๋‹ˆ ํ•ด๋‹น id ๊ฐ’์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์งˆ๋ฌธ ์ž‘์„ฑ ํŽ˜์ด์ง€๋กœ ์ด๋™์ด ๋˜์—ˆ์Œ
์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์›์น˜ ์•Š๋Š” ํŽธ์ง€๋ฅผ ๋ฐ›์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด url ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•จ

2. ๊ณ ๋ฏผ ๋ฐฉ์•ˆ
์ƒ๊ฐ1) ์šฐ์ฒดํ†ต ํ‚ค ๊ฐ’ ํ•„๋“œ์— unique=True ์„ค์ •ํ•  ๊ฒฝ์šฐ
URL ํ˜•ํƒœ : poppymail/{secret_key}
์žฅ์  : ๋น„๋ฐ€ ํ‚ค ๊ฐ’ ๊ฒน์น  ํ™•๋ฅ  0
๋‹จ์  : ๋น„๋ฐ€ ํ‚ค ๊ฐ’์ด 8์ž๋ฆฌ์ด๊ณ , char ํƒ€์ž…์ด๋ฏ€๋กœ ๋งค๋ฒˆ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๊ฐ’์ด ์ด๋ฏธ ์กด์žฌํ•˜๋Š”์ง€ ์šฐ์ฒดํ†ต ํ…Œ์ด๋ธ”์—์„œ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ db์— ๋ถ€๋‹ด์ด ํด ๊ฒƒ์ž„

์ƒ๊ฐ2) unique=True ์„ค์ • X (์ฑ„ํƒ!)
URL ํ˜•ํƒœ : poppymail/<int:pk>/?key={key}
์žฅ์  : ์ƒ๊ฐ1์˜ ๋‹จ์ ์ด ๋ณด์™„๋จ
๋‹จ์  : URL์˜ ํ˜•ํƒœ์—์„œ์ฒ˜๋Ÿผ ์ „๋‹ฌ๋œ pk์— ํ•ด๋‹นํ•˜๋Š” ์šฐ์ฒดํ†ต์˜ key๊ฐ’๊ณผ ์ „๋‹ฌ๋œ key๊ฐ’์ด ์ผ์น˜ํ•˜๋Š”์ง€ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•จ

๊ฒฐ๋ก ) ์ƒ๊ฐ1๋ณด๋‹ค๋Š” key ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๋กœ์ง์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ๋” ํšจ์œจ์ ์ผ ๊ฒƒ ๊ฐ™์•„์„œ ์ƒ๊ฐ2๋ฅผ ์ฑ„ํƒํ•จ !

profile
for develop โ˜๏ธ

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