2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

cakephp3 에서 해시화 된 암호를 비교해서 갱신하는 방법

그럴 때 있잖아 패스워드 잃어버려서 갱신해야 할 기분...
그런데 있잖아 암호화 되서 그 결과가 실패인거지..
다들 말하잖아 그냥 가져다가 비교하면 되는 거 뭐 그리 고민하냐고~
회사 선배 말했잖아 핸들러 쓰지 않으면 당연히 에러라고~

나는 쇼미충 우원재 랩 분위기로 ㅋㅋㅋㅋ

cakephp3 에서는 인증 컴포넌트에서 기본적으로 패스워드를 암호화 하는 기능을 제공한다.
제대로 설정만 해 주면 1234 라고 입력해도 DB에는 제대로 암호화 된 해시값(해쉬스완 아님...풋!풋!풋!메롱~) 이 들어간다.
그러고나면 Bake로 생성된 CRUD 페이지에서 암호 입력과 수정이 되는데 뭔 걱정..?? 이라고 생각했는데..
패스워드를 분실해서 갱신하거나 재발급 하는 경우, 혹은 임시로 패스워드를 발급한 후 강제적으로 패스워드를 갱신시킨 후 로그인이 가능하게 하는 경우 등등...에 폼에서 입력받은 값과 디비에서 꺼내온 암호화 된 값을 비교해야 한다.

이 때, 그냥 디비에 있는 암호를 복호화 시킨다거나
$password_now = $this->request->data['password_now']; // 입력받은 패스워드 값을 넣고
$password = $user->password; // DB에서 패스워드 불러와서
$password = Security::decrypt($pwd,$salt_key); // 멋대로 복호화를 해서
if ($password === $password_now){//code} // 이렇게 비교하면 바보인증..

혹은 입력받은 패스워드를 암호화 해서 비교를 한다거나...
$password_now = $this->request->data['password_now']; // 입력받은 패스워드 값을 넣고
$password_now = Security::hash($password_new,$salt_key); // 멋대로 암호화를 해서
$password = $user->password; // DB에서 패스워드 불러와서
if ($password === $password_now){//code} // 이렇게 비교하면 바보인증..

하면 여러가지 에러를 만나게 된다..예를 들면 이런 거...(그 외에도 매칭되는 데이터가 없다는 등등..)
![イメージ説明

그래서 찾아본 결과~DefaultPasswordHasher 를 이용하지 않으면 아니아니 아니되오~(언제적 개그냐)
저 놈을 불러온 후, check()라는 함수로 두 값을 비교한 후, 갱신하고 싶은 값을 변수에 할당한 후 save() 하면
다시 자동적으로 해시화 되어서 암호가 저장된다.
다음은 예시~ㅋㅋ
> /src/Controller/UsersController.php
use Cake\Auth\DefaultPasswordHasher; // 필수추가 class UsersController extends AppController {  // 다른 코드는 생략했어요.. public function change() { if ($this->request->is('post')) { $user_id = $this->request->data['user_id']; $password_now = $this->request->data['password_now'];     $password_new = $this->request->data['password_new']; $query = $this->Users->find()->where(['user_id' => $user_id]); $user = $query->first(); if($user) { // 이용자 정보를 디비에서 불러왔다면 디폴트패스워드해시를 사용해서 두 값을 비교 $hasher = new DefaultPasswordHasher(); $equal_check = $hasher->check($password_now, $user->password); // 입력한 패스워드가 암호화 된 패스워드와 일치하는 경우 디비에 패스워드를 갱신 if($equal_check) { $user->password = $password_new; if ($this->Users->save($user)) { $this->Flash->success(__('패스워드를 갱신했습니다. 로그인 해 주세요')); return $this->redirect(['action' => 'login']); } else { $this->Flash->error(__('패스워드 갱신에 실패했습니다.')); } } } } }

기본 중의 기본인데 이걸 못해서 개삽질을 6시간이나 하고 있었다는 슬픈 이야기...ㅠㅠ

*잡담 : 오랫만에 동광신기 스러운 글을 써 봤네...김광일이 보고싶구나 어디서 뭐하냐...

댓글

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법