<학습내용>
로그인과 회원가입
1. 회원가입
회원가입을 할 때 오늘 처음 배운 것은 hash함수라는 것이다. hash함수가 필요한 이유는 암호화 때문이다. 사용자가 회원가입할 때 pw를 입력했는데 그걸 개발자나 관리자가 볼 수 있으면 보안상 문제가 생기기 때문에 개발자나 관리자조차 알 수 없도록 암호화 할 때 hash 함수를 사용한다.
hash함수에는 종류가 여러 개가 있는데 오늘 배운 것은 SHA256이었다. 이걸 사용하면 2의 256제곱만큼 경우의 수가 생성되어 무작위 입력으로는 절대 비밀번호를 풀 수 없을 수준이 된다고 한다. (어마어마하다)
파이썬에는 hash함수 라이브러리가 내장되어있기 때문에 사용하고 싶을 때 바로 import hashlib 을 해주면 사용할 수 있다.
password_hash = hashlib.sha256(password_receive.encode('utf-8')).hexdigest()
코드는 실제로 사용하는 예시이다. password_receive에 사용자가 입력한 pw가 담겨있고 그것을 hash함수를 이용해서 password_hash라는 변수에 담아놓으면 추후에 사용할 수 있다.
2. 로그인
로그인 기능을 구현하기 위해서는 반드시 알아야 할 것이 JWT이다. JWT란 JSON Web Token의 약자이다. 로그인할 때는 이 JWT를 가지고 모든 과정이 이루어진다.
JWT를 오늘 강의에서 비유한 것에 따르면 놀이공원의 자유이용권 같은 것이라고 한다. 비유가 참 좋은 것 같다. JWT가 한 번 사용자한테 주어지면 사용자는 자유이용권을 가지고 놀이공원의 모든 기구를 탈 수 있는 것처럼 JWT를 가지고 사이트의 모든 서비스를 이용할 수 있게 되는 것이다.
JWT를 flask에서 사용하기 위해서는 우선 pyJWT라는 패키지를 설치하고 import jwt 를 해주면 된다.
로그인을 할 때 JWT와 세트로 등장하는 개념이 '쿠키'다. 그동안 쿠키란 말을 정말 많이 들어봤던 것 같다. 크롬에서 쿠키삭제 이런 말도 많이 보기도 했고 말이다. 그런데 오늘에서야 쿠키의 정체를 알게 되어서 기분이 정말 좋았다.
쿠키란 브라우저의 자체 임시 데이터베이스라고 생각할 수 있다. 쿠키에는 정보들이 dictionary형태로 저장된다. 유저에게 JWT가 주어지면 그 JWT를 쿠키에 보관해두는 것이다. 이렇게 해두면 쿠키에 JWT가 있는 것이 확인되면 다시 로그인 할 필요 없이 한 번의 로그인만으로도 서비스를 이용할 수 있는 것이다. 다만 쿠키는 브라우저의 임시 데이터베이스이기 때문에 내가 만약 크롬으로 이용하다가 갑자기 사파리로 브라우저를 바꾼다면 다시 로그인을 해야한다.
로그인이 이루어지는 과정을 정리해보았다.
1. 유저가 로그인 페이지에서 ID와 PW를 입력함
2. 입력받은 PW를 hash함수를 이용해서 암호화함
3. ID와 2에서 얻은 암호화 PW를 이용해서 DB에 같은 정보가 있는지 확인
3-1 만약 정보가 없다면 회원가입을 유도
3-2 만약 정보가 있다면 4로 go
4. 유저의 ID와 로그인 만료시간 등이 담긴 정보를 payload에 담고 이걸 암호화해서 클라이언트에 넘겨줌(암호화한 payload = JWT)
5. 받아온 토큰을 쿠키에 저장함
6. 로그인 성공!
3. 정규식
회원가입을 할 때 정규식이라는 것을 배웠다. 회원가입할 때 보면 몇 자 이상은 되어야 하고 특수문자는 어떤 것들이 가능하고 등등 이런 제약사항이 항상 써 있는 것을 볼 수 있다. 이런 것을 검증하는 식이 정규식이다.
솔직히 정규식은 외워서는 절대 못 쓸 거 같고 필요할 때 관련된 정규식을 검색해서 사용하면 될 것 같다.
대표적인 정규식
1. 아이디 정규식 : /^(?=.*[a-zA-Z])[-a-zA-Z0-9_.]{2,10}$/
2. 비밀번호 정규식: /^(?=.*\d)(?=.*[a-zA-Z])[0-9a-zA-Z!@#$%^&*]{8,20}$/
'스파르타 내일배움 캠프 > Today I Learned' 카테고리의 다른 글
| '22.05.06 Today I Learned (0) | 2022.05.06 |
|---|---|
| '22.05.04 Today I Learned (0) | 2022.05.04 |
| '22.05.02 Today I Learned (0) | 2022.05.02 |
| '22.04.29 Today I Learned (0) | 2022.04.29 |
| '22.04.28 Today I Learned (0) | 2022.04.28 |