[TIL] 인증 / 인가

나른한 개발자·2022년 1월 17일
0

studylog

목록 보기
26/45

인증

유저가 누구인지 확인하는 절차
개인을 특정할 수 있는 정보(비밀번호, 주민등록번호 등)은 무조건 암호화하여 저장하도록 법으로 규제되어 있음.

프론트에서 넘어온 암호는 해싱하여 복원할 수 없도록 하여 저장한다.
다만 프론트에서 비밀번호가 전달될 때도 SSL를 기반으로 암호화가 되어야 보안성을 더 높일 수 있다. SSL적용 (HTTPS)

SHA-256(단방향 해시 알고리즘)

SHA-256 알고리즘을 이용하여 해시를 한다. 단방향 해싱이기 때문에 복호화할 수 없다. 하지만 같은 문자를 넣었을 때 항상 같은 값으로 해싱된다는 단점이 있음.

salting / key stretching

  • salting: 말그대로 소금을 치듯이, 단방향 해싱 값에 무작위한 값을 같이 해시하는 것이다. 단방향 해싱값은 복호화가 안되기 때문에 솔트값을 같이 저장하여 비밀번호를 대조할 때 솔트값을 사용.

  • key stretching: 무작위 대입을 통해 해시값을 계산하는데에 필요한 시간을 늘리도록 하는 것

bcrypt 라이브러리

bcrypt 라이브러리를 이용하면 소금값과 반복횟수를 같이 저장하기 때문에 복잡한 데이터베이스 테이블 구조를 만들 필요없음

인가

유저가 request에 대한 권한이 있는지 확인하는 절차
http는 stateless하지만 인가 과정으로 로그인을 유지할 수 있도록 함.

로그인처럼 상태가 유지되어야 하는 경우 request헤더에 메타정보(토큰)을 담아 요청한다. 이 메타정보를 Json Web Token(JWT)라고 한다. (백엔드에서 보내줌) 그 이후로 토큰을 가지고 요청을 하게되는 것임.

JWT

헤더, 내용, 서명의 구조로 나뉨

  • 헤더: 타입, 알고리즘을 인코딩하여 저장한다. 암호화가 아닌 인코딩이기 때문에 디코딩 하면 다른 누군가가 볼 수 있다. 따라서 개인 정보를 넣으면 안됨!
  • 내용(payload): 유저 아이디를 인코딩하여 저장한다. 이 역시 암호화가 아니라 개인정보 넣으면 노출 될 수 있기 때문에 DB상의 user_id 를 넣어줌.
  • 서명: 우리 서버가 발급한 토큰이 맞는지 확인할 수 있는 부분이다. 우리 서버의 시크릿키를 이용하여 인코딩된 헤더와 내용(페이로드)을 암호화하여 저장한다. 대조를 할 때는 시크릿키를 이용하여 대조한다.
profile
Start fast to fail fast

0개의 댓글