[TIL.38]パスワード-認証、承認
資格認定
プレイヤーIDとパスワードを確認するには
1)ユーザーIDとパスワードの作成
2)ユーザが暗号化されていない場合はDBに保存する.
3)ユーザーログイン→ユーザー名とパスワードの入力
4)ユーザが入力したパスワードを暗号化し,データベース内のユーザパスワードと比較する.
5)一致した場合、ログインに成功
6)ログイン成功後 クライアントに
access token
を送信します.7)ユーザログインが成功すると、
access token
を添付し、ログインのたびにリクエストをサーバに送信します.1.パスワードパスワードは一般的に一方向ハッシュを使用します。
一方向ハッシュ関数とは?
元のメッセージを変換し、暗号化メッセージの要約を生成します.元の情報が分かれば簡単に暗号化された情報を得ることができるが,暗号化された情報は元の情報を得ることができないため,一方向性と呼ぶ.
一方向ハッシュ関数の弱点を保護するために,通常2つの補足点がある.
1) salting
ハッシュ値を計算する方法は、実際のパスワードのほかにランダムなデータを追加することもできます.
2) Key Stretching
一方向ハッシュ値を計算し、ハッシュ値をハッシュし、ハッシュ値を繰り返します.
->キスストレッチは、一般的に1秒間に50億個以上のDigestが装備されていますが、Keyストレッチを使うと、同じ装備で1秒間に5回程度しか比較できません.
2. Brypt
SaltingおよびKey Stretchingによって実現されるハッシュ関数の中で最も広く使用される.
最初からパスワードを一方向に暗号化するために作成されたハッシュ関数.
bcryptは
string
データを暗号化するのではなく、byte
データを暗号化する.したがって,暗号化にはバイト化が必要である.
すなわち、符号化は
bytes
であり、復号化はstr
である.Encode、decodeでは「UTF-8」Unicode文字仕様を使用して、私たちが認識できる形式に変換します.
1)会員登録時にパスワードを保存する
会員登録してパスワードを暗号化する場合は
bcrypt.hashpw()
を使用します.初めてプレイヤーがパスワードを作成すると
str
になるので、byte
に符号化されます.# bcrypt 설치
pip install bcrypt
import bcrypt
hashed_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt())
# 비밀번호를 데이터에 저장할때는 decode해서 string 형태로 저장해주어야 한다.
decode_hash_pw = hashed_password.decode('utf-8')
パスワードを保存するときは、str
に再復号して保存します.なぜそれを。。stringとして保存するのですか?
暗号化(バイト)をデータベースに格納すると、bが加算されます.
これにより,後でパスワードを登録して確認すると,bを含むstringタイプが再符号化されるので,パスワードの値はいっそ変更される.したがって、パスワードを保存するときは、バイトではなくstrタイプを使用する必要があります.
=>バイトタイプで保存すると、このように表示されます.
=>符号化を再復号してstr形態に変換する.
2)ログイン時にパスワードを確認する
ログイン時にデータベースに格納されているパスワードと比較して、
bcrypt.checkpw()
を使用します.bcrypt.checkpw(data['password'].encode('utf-8'),passwords.encode('utf-8'))
ユーザが入力したパスワードを符号化し、記憶しているpasswords
に対しても符号化比較パスワードを行う.承認
ユーザが要求を実行する権利のあるユーザであるかどうかを決定するプロセス.
これらのステップはJWTによって実現できる.
これは、ユーザがユーザ要求の要求を実行する権利があるかどうかを決定することを意味する.
1)許可によりアクセストークンを生成する.アクセスポイントには、ユーザ情報を確認できる情報が含まれています.
2)ユーザが要求を送信する場合、アクセスポイント送信を付加する
3)サーバは,ユーザが送信したアクセストークンを復号する.
4)復号データによりユーザIDを取得する.
5)useridを使用して、そのユーザの権限をデータベースで確認します.
6)ユーザーが十分な権限を持っている場合、その要求を処理する.
7)ユーザに権限がない場合、401または他のエラーコードが送信される.
JWT(JSON Web Tokens)
# pyjwt 설치
pip install pyjwt
import jwt
if bcrypt.checkpw(data['password'].encode('utf-8'),passwords.encode('utf-8')):
token = jwt.encode({'id': User.objects.get(email=email).id}, SECRET['secret'], algorithm='HS256')
return JsonResponse({'token': token}, status=200)
else:
return JsonResponse({'MESSAGE': 'NOT FOUND'}, status=404)
ユーザ情報を含むjsonデータを暗号化し,クライアントとサーバ間で交換する.
ユーザーログインに成功するとtokenという暗号化されたユーザー情報が添付され、requestがユーザーに送信されます.
ログインに成功した場合jwt.encodeでトークンを作成し、フロントに送信すると、フロントはローカルストレージにトークンを格納します.
このトークンの役割は,現局がタイトル部分でトークンを送信する際に,トークンによってバックエンドがどのようなプレイヤーであるかを探し出し,対応するデータをそのプレイヤーに公開または取得することである.
token
を解読すればuser idがわかる.Reference
この問題について([TIL.38]パスワード-認証、承認), 我々は、より多くの情報をここで見つけました https://velog.io/@jxxwon/비밀번호-인증-인가テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol