1 ๋ถ„ ์†Œ์š”

์‚ฌ์šฉ์ž๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žŠ์–ด๋ฒ„๋ ธ์„ ๋•Œ..

์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฉ”์ผ์„ ์žŠ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๋Š” ๋˜๊ฒŒ ๋งŽ์Œ.

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์•„๋ž˜ ๋‘ ๋ฐฉ๋ฒ•์ด ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ž„.

  • ํŒจ์Šค์›Œ๋“œ ๋ณต์›
  • ํŒจ์Šค์›Œ๋“œ ์žฌ๋ฐœ๊ธ‰

1. ํŒจ์Šค์›Œ๋“œ ๋ณต์›

์šฐ์„ , Django ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ์ค‘์š”ํ•จ.

Django์˜ make_password()๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•  ๋•Œ, ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅ๋ฐ›์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณต์›ํ•˜๊ธฐ ์–ด๋ ค์›€..

๋‹จ๋ฐฉํ–ฅ ํ•ด์‹ฑ์˜ ๋‹จ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ๋ณด์•ˆ์ ์ธ ์ธก๋ฉด์—์„œ๋Š” ๊ต‰์žฅํ•œ ์žฅ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•จ.

2. ํŒจ์Šค์›Œ๋“œ ์žฌ๋ฐœ๊ธ‰

๊ทธ๋Ÿฌ๋ฉด Django์—์„œ๋Š” ํŒจ์Šค์›Œ๋“œ๋ฅผ ์žฌ๋ฐœ๊ธ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•ด์•ผํ•จ.

๋ณดํ†ต ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์„๊นŒ?

  1. ๋กœ๊ทธ์ธ โ†’ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊นŒ๋จน์Œ โ†’ ๋กœ๊ทธ์ธ ์‹คํŒจ โ†’ โ€œ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐโ€ โ†’ โ€œ์ด๋ฆ„โ€, โ€œemailโ€ ๋“ฑ๊ณผ ๊ฐ™์ด 2๊ฐœ ์ด์ƒ์˜ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›์•„ ์œ ์ € ์ธ์ฆ โ†’ ์ธ์ฆ๋˜๋ฉด ์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํ™”๋ฉด์œผ๋กœ ์ด๋™ โ†’ ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ(์ž…๋ ฅ, ํ™•์ธ์ž…๋ ฅ) โ†’ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ƒ์„ฑ (๊ธฐ์กด DB๊ฐ’์„ ์ด๊ฑธ๋กœ ๊ฐฑ์‹ )

    ์ด๋ฉ”์ผ ์ธ์ฆ๋งŒ ์ ์šฉํ•ด์•ผ๋ ๋“ฏ

  2. ๋กœ๊ทธ์ธ โ†’ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊นŒ๋จน์Œ โ†’ ๋กœ๊ทธ์ธ ์‹คํŒจ โ†’ โ€œ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ๋ฐœ๊ธ‰โ€ โ†’ โ€œ์ด๋ฆ„โ€, โ€œemailโ€ ๋“ฑ๊ณผ ๊ฐ™์ด 2๊ฐœ ์ด์ƒ์˜ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›์•„ ์œ ์ € ์ธ์ฆ โ†’ ์ธ์ฆ๋˜๋ฉด ์ด๋ฉ”์ผ๋กœ ์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ ์ƒ์„ฑํ•ด์„œ ์ „์†ก โ†’ DB๋Š” ํ•ด๋‹น ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๊ฐฑ์‹  โ†’ ์‚ฌ์šฉ์ž ๋‹ค์‹œ ๋กœ๊ทธ์ธ โ†’ ๋งˆ์ดํŽ˜์ด์ง€ ๊ฐ€์„œ โ€œ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝโ€ โ†’ ๋ณ€๊ฒฝ ์™„๋ฃŒํ•˜๋ฉด DB์—์„œ ๋‹ค์‹œ ์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๊ฐฑ์‹ 

์œ„์™€ ๊ฐ™์ด ๋‘ ๊ฐœ์˜ ํ๋ฆ„์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์„ ๋“ฏ?

1๋ฒˆ์€ DB ์ž‘์—…์ด 1๋ฒˆ, 2๋ฒˆ์€ DB ์ž‘์—…์ด 2๋ฒˆ์ž„.

1๋ฒˆ์˜ ์žฅ์ 

  • DB ์ž‘์—…์ด ์ ์Œ (1๋ฒˆ)
  • ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ ์ƒ์„ฑ ํ•„์š” ์—†์Œ

2๋ฒˆ์˜ ์žฅ์ 

  • ์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ด๋ฉ”์ผ๋กœ ์ „์†กํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž ํ™•์ธ 2๋ฒˆ? (์‚ฌ์‹ค์ƒ ํ•„์š”์—†์Œ)
  • ๊ฐœ์ธ์ •๋ณด์ˆ˜์ •์—์„œ โ€œ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝโ€ ๊ธฐ๋Šฅ๊ณผ ์œ ์‚ฌํ•˜๋ฏ€๋กœ, ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ

1๋ฒˆ์ด ์ข‹์ง€ ์•Š์„๊นŒ ์‹ถ์Œ..

Django์—์„œ๋Š” ์ด๋Ÿฐ ๊ธฐ๋Šฅ ์—†๋‚˜?

๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Œ.

1. ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ํ† ํฐ ์ƒ์„ฑ

  • Django์˜ ๊ธฐ๋ณธ auth ์•ฑ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•จ
  • PasswordResetView ๋ฐ PasswordResetConfirmView๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฉ”์ผ์„ ํ†ตํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ
from django.contrib.auth.views import PasswordResetView

urlpatterns = [
    path('password_reset/', PasswordResetView.as_view(), name='password_reset'),
]

2. ์žฌ์„ค์ • ๋งํฌ๋ฅผ ์ด๋ฉ”์ผ๋กœ ์ „์†ก

  • send_mail()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋จ

3. ๊ด€๋ฆฌ์ž๋งŒ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ดˆ๊ธฐํ™”

  • ๊ด€๋ฆฌ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ์ดˆ๊ธฐํ™”
from django.contrib.auth.models import User

user = User.objects.get(username="example_user")
user.set_password("new_password")
user.save()

API ๊ตฌ์ƒํ•˜๊ธฐ

1๋ฒˆ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜์ž.

์ด๋ฉ”์ผ ์ธ์ฆ๋งŒ ์‚ฌ์šฉํ•ด์„œ!

1. [POST] api/send-password-reset-mail

  • request
{
		"email": "AAA@BBB.com"
}

์ด๋ฉ”์ผ ๋ณธ๋ฌธ์— ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ํ™”๋ฉด ๋งํฌ๋ฅผ ์ฒจ๋ถ€

  • response
{
		"status": "True", // or "False",
		"uuid": "{UUID}",
		"http_status": "200_OK" //  or "404_NOT_FOUND"
}

2. [POST] api/get-new-password/{uuid}

  • request
{
		"email": "AAA@BBB.com",
		"password": "{PASSWORD}",
		"uuid": "{UUID}"
}

๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ”„๋ก ํŠธ์—์„œ ์ž…๋ ฅ ๋ฐ ํ™•์ธ ์ง„ํ–‰

{
		"status": "True", // or "False"
		"http_status": "200_OK" // or "400_BAD_REQUEST"
}

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ