생성은 백앤드 관리는 프론트에서 한다.
Authentication is the act of validating that users are whom they claim to be. This is the first step in any security process. -okta-
-> 인증이란 사용자가 누구인지 확인하는 행위
-> id, 비밀번호는 일반적인 인증 요소임
-> 1회성 핀 넘버 : 하나의 세션(1번)만 가능하게 만드는 액세스 권한
-> 액세스를 허용하는 외부 app을 이용한 인증
-> 지문 같은 생체 인식을 이용한 인증
Authorization in system security is the process of giving the user permission to access a specific resource or function. This term is often used interchangeably with access control or client privilege.
-> 인가란 유저에게 특정한 리소스에 접근할 수 있는 권한을 주는 것
인증은 선택한 인증 요구 사항(비밀번호, 생체인식 등)에 따라 올바른 증명을 한다면 엑세스 가능
인가는 애초에 리소스에 대한 권한을 부여하고 그에 해당하는 데이터에만 액세스 할 수 있습니다.
법규상의 강제개인정보 보호법로 인해서 사용자의 개인 정보 처리에 힘을 쏟아야함
db에 저장 시 개인 정보를 해싱하여 복원할 수 없도록 하기 위해 hash를 해서 난독화를 한다.
비밀번호는 통신 시 개인 정보를 주고받을 때 SSL을 적용하여 암호화한다(HTTPS; HTTP secure를 사용)
본래 해쉬 함수는 자료구조에서 빠른 자료의 검색, 데이터의 위변조 체크를 위해서 쓰이지만 복원이 불가능한 단방향 해쉬함수는 암호학적 용도로 사용한다.
MD5, SHA-1, SHA-256를 사용.
1234를 SHA-256 해싱하면 다음과 같다.
결과만 봐서는 당장 식별이 불가능하므로 완벽해보이지만 같은 알고리즘으로 1234 다시 해싱하면 항상 같은 결과가 도출되어 금방 해킹당할 수 있다.
이런 허점을 이용한 것을 rainbow table이라고 부른다
(*해시값을 계산한 테이블을 모아둔 것)
이같은 허점을 보완하고자 salting, key streting이라는 아이디어가 생겼음. 비밀번호와 임의로 생성한 문자열를 합쳐서 해싱하여 이 해시값을 salting이라고 함
이 때 비교를 위해 해시값과 salting을 같이 저장함
해커가 패스워드 무작위 대입을 통해 해시값을 계산하는데 필요한 시간을 대폭 늘리기 위해 솔팅 및 해싱을 여러번 반복해서 원본 값을 유추하기 어렵게 만드는 것이 key strecting이다.
오픈 소스 라이브러리이며 다양한 언어를 지원하며 간단하게 사용할 수 있다.
bcrypt는 hash 결과값에 소금값과 해시값 및 반복 횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는데 DB설계를 복잡하게 할 필요가 없다.
bcrypt를 통해 해싱된 결과값(Digest)의 구조는 알고리즘 + 알고리즘 옵션(eg cost) + salt + hashed password 입니다.
--
서버는 사용자가 로그인 했을 경우 로그인 했다는 것을 아는 방법
headers 에 메타 데이터(데이터들의 데이터)를 보내서 확인
메타 정보를 바로 json web token = jwt 라고 한다.
요청 1의 응답 1에서 200 ok과 token 발행
요청 2는 발행받은 token과 함께 요청 보냄
단순 해쉬값이 해킹에 쉽게 노출되기 때문에 솔팅이 생겼음
header.payload(내용).sugnature(서명)
해더 : 토큰의 타입과 해시알고리즘 정보가 들어감, 헤더의 내용은 BASE64 방식으로 인코딩해서 JWT 가장 첫 부분에 기록
페이로드 : exp와 같이 만료 시간을 나타내는 공개 클레임
클라이언트와 서버간 협의하에 사용하는 비공개 클레임
두가지 요소를 조합하여 작성한 뒤, BASE64 인코딩하여 두번째 요소로 위치
서명 : jwt가 원본 그대로라는 것을 확인할 때 사용
BASE64URL 인코딩된 해더와 payload 그리고 jwt secret (별도 생성-특정값) 헤더에 지정된 암호 알고리즘으로 암호화하여 전송(복호화 가능)
프론트엔트가 jwt를 백엔드 API 서버로 전송하면 서버에서는 전송받은 jwt의 서명부분을 복호화하여 서버에서 생성한 jwt가 맞는지 확인합니다.
위변조를 맞기위해 서로 사인하므로 누구나 원본을 볼 수 있으니 개인정보를 담아서는 안된다.
참고 자료
https://www.okta.com/identity-101/authentication-vs-authorization/