인증은 왜 필요할까?
: 우리 서비스를 누가 쓰는지? 어떻게 사용하는지? 추적이 가능하도록 하기위해서 필요하다.
인증에 필요한 것은 무엇이 있을까?
: 아이디, 이메일 주소, 비밀번호 등
: 이 중 가장 중요한 것은 비밀번호이다. (가릴 수 있는 것은 비밀번호 밖에 없다...)
그렇다고 한다, 다시말해 비밀번호와 같은 중요 정보는 법적으로도 보호가 강제되는 사항이기 때문에 반드시 암호화하여 쉽게 노출되지 않도록 만들어야 한다.
비밀 번호의 관리 방법
1. Database에 저장 시, 개인 정보를 해싱하여 복원할 수 없도록 함.
2. Front <-> Back 통신 시, (개인 정보를 주고 받을 때) SSL을 적용하여 1차로 암호화 = HTTPS
단방향 해쉬! : 만든 개발자조차도 복호화할 수 없도록 만드는 것.
하지만 만드는 경우의 수가 고정되어 있기 때문에 모든 경우의 수를 해싱하여 저장하면, 암호화된 데이터를 원래의 값으로 쉽게 돌릴 수 있다는 치명적 문제가 있다.
따라서 이러한 문제점을 개선하기 위해 조금 더 복잡한 구조로 암호화를 하게된다.
> Salting & KeyStreching
다만, salting하는 방법도 스크립트를 돌리는 횟수를 늘리면 언젠가는 뚫릴 수 밖에 없다.
(시간 문제라는 얘기)
보안(암호화)는 100% 완벽이 있을 수 없다. 단지, 복잡한 구조를 만들어 해커가 파훼하는 것을 느리게하고 시간을 벌어주는 방향으로 계속해서 발전하는 것뿐.
그래서 특정 사이트에서 주기정으로 비밀번호를 변경하도록 제안,제시해주는 것!
그러나, 그렇다고해서 백엔드 개발자가 직접 복잡한 암호화 알고리즘을 짤 필요는 없다.
백엔드 개발자는 서버에 대한 것을 개발하는 것이지, 화이트해커가 아니다.
대신에 이미 만들어진 우수한 암호화 알고리즘 라이브러리를 사용하면 된다.
bcrypt : 현재 잘 사용되고 있는 강력한 암호 알고리즘 중 하나.
인가???? ex) 관리자 권한으로 실행, 쿠팡과 같은 사이트에서 제품 구매시 로그인을 요청하는 것
>>> 권한이 없기 때문에 인가를 받아야 한다.
로그인 상태의 유지를 위해서 토큰을 사용한다.(로그아웃하면 보통 사라지겠지?)
여기서 짚어갈 점은 암호화를 하는 것이 아니라 인코딩 이라는것이다.(보안에 상당히 취약함)
- 인코딩: 공개적으로 사용 가능한 방법을 통해 데이터를 변환하는 것. 다른 시스템에서의 데이터 유용성을 높이고 저장에 필요한 공간을 줄이려는 의도. (ex. 문자 'A'는 아스키코드 65번으로 표시) 인코딩 된 데이터는 표준방법을 사용하여 쉽게 디코딩할 수 있다.
- 암호화: 데이터를 비밀로 유지하려는 의도로 데이터를 변환하는 것. 암호 알고리즘을 이용해 데이터를 암호화하고 특수 키를 사용하여 암호를 해독한다. (ex. 대칭키, 공개키 방식.)
참고
토큰을 계속 들고 있으면 해커가 탈취하여 사용자의 정보를 무단사용할 가능성이 높아진다.
따라서, 토큰의 만료기한을 부여한다.
여기의 payload도 마찬가지로 암호화가 아니라 인코딩!
예시의 user-id는 DB의 PK를 이용하는 것이다. 사용자 데이터를 DB에서 뽑아다 쓰기 때문에 사용자 정보를 들고 돌아다니지 않는다.
settings.py에 있는 시크릿 키와 같이 넣어서 해더의 알고리즘으로 같이 돌려서 저장하는 것.
만약에 해커에게 뚫려서 토큰을 탈취 당하면, 토큰을 들고 사용자인 것처럼 요청을 보낼 수 있다.
대신, 그 안의 개인정보를 알 수는 없다.
DB에 있는 개인정보등을 조회할 수는 없으니...
그리고 개인정보 조회나 수정도 비밀번호를 추가로 입력해야하는 등의 절차가 있기 때문에 토큰만 가지고는 추가적인 개인정보 탈취는 어렵다.
추가로 토큰의 만료시간이 있기 때문에 탈취되더라도 무한정 사용하지 못한다.