최초의 아스키코드는 알파벳만 있었는데 나중에 벤더사 및 언어와 국가에 따라서 아스키코드가 확장되어 확장된 부분들은 다들 조금씩 달라서 공통된 출력문자 64개만을 통해 인코딩하여 데이터의 왜곡이 없도록 함
인코딩(encoding)은 정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식
Base64(2^6)란 Binary Data를 Text로 바꾸는 Encoding
(문자열 →) 아스키코드(7bit encoding 0-127) → 각 숫자를 이진법으로 변환(8자리 최대 127(10)==01111111(2)) → 이진법으로 바꾼 걸 쭉 나열해서 6bit씩 끊음 → 6bit(2)를 2진법을 10진법 숫자로 변환 → base64 표에서 해당하는 문자로 변환(base64 encode)
아스키코드 | base64 |
---|---|
8bit와 6bit의 최소공배수 24bit를 단위로 변환하는 도중에 공백이 생기거나 bit가 모자랄 수 있다
(24bit는 8bit*3이므로 결국 3글자씩 변환하는 것)
6bit씩 끊을 때 마지막에 bit가 모자라는 경우엔 모자라는 bit만큼 0을 채워서 6bit를 완성시켜서 해당하는 문자를 찾고
6bit set가 통째로 모자라는 경우엔 패딩문자(=)를 사용한다
Base64 인코딩을 하게되면 6bit당 2bit의 오버헤드가 발생하여 전송해야하는 데이터의 양이 33%증가함
+인코딩과 디코딩에 CPU연산도 필요함
Base64는 HTML 또는 Email과 같이 문자를 위한 Media에 Binary Data를 포함해야 될 필요가 있을 때가 언제야?, 포함된 Binary Data가 시스템 독립적으로 동일하게 전송 또는 저장되는걸 보장하기 위해 사용한다
+HTML, JSON형식은 문자열로 데이터 다루는데, 여기에 바이너리를 삽입할때 BASE64사용하면 굉장히 유리하다.❓
뭐라는 걸까 ❓
아스키카 원래 7bit고 base64는 6bit인데 base 64로 바꾸긴 해야겠는데 7이랑 6은 최소공배수가 42니까 너무 커서 1bit를 추가해서 24bit로 맞춘건가..?
아스키카 7bit 인코딩인데 나머지 1bit를 처리하는 방식이 시스템별로 상이하다는게 8자리로 애초에 맞출려고 했다는 것 같기도 하고..
안전한 64개의 출력문자...아 근데 원래 데이터를 처리할 수 있는 단위가 2의 제곱수에 비례해서 8로 맞춘건가?
window x64 x32 이런거????????????????????으엉ㄲ??????????
유저의 패스워드를 받은 클라이언트는 평문으로 서버로 전송합니다. 평문을 받은 서버는 패스워드를 단방향 해시 함수로 암호화하여 보관합니다.
단방향 해시함수: 수학적 연산에 의해 원본 데이터를 완전히 다른 암호화된 데이터(다이제스트)로 변환하는 것
단방향: 원본 데이터로는 다이제스트를 구할 수 있지만 다이제스트로는 원본데이터를 구할 수 없어야 한다
*양방향 (암호화 - 복호화 가능)
브루트포스 공격에 취약
→ 원문 메세지를 얻기 위해서 소요되는 시간이 증가하므로 보안+1
set_password
check_password
JSON객체로 정보를 전달할 수 있음
less verbose makes JWT a good choice to be passed in HTML and HTTP environments.
서명된 토큰 ( 토큰 자체가 인증된 정보 )
클레임 토큰 기반 인증
클레임 토큰
클레임: 요청하는 것의 이름과 값으로 구성(딕셔너리/JSON형태)
payload에 있는 값들 ex. 성명: 소세지
토큰 안에 사용자 정보나 데이터 속성들을 담고있
클레임 기반: 클레임 값을 기반으로 리소스에 대한 접근을 권한을 부여
*일반 토큰
단순한 문자열로 구성되어있어 데이터를 담을 수 없음
인증에 필요한 정보가 서버에 있어서 DB에 접근해야함
꼭 DB서버가 아니더라도 application/인증 등의 서버에 접근한다는 건 stateless하지 않음
➡️ 마이크로 서비스(분산 시스템)에서 중앙 집중식 인증서버/ DB서버에 의존하지 않는 인증 방식을 사용할 수 있게 됨
JWT is used at Internet scale. This highlights the ease of client-side processing of the JSON Web token on multiple platforms, especially mobile.
로그인
사용자가 id와 pw를 이용해서 브라우저를 통해 로그인 요청을 보내
서버가 DB를 조회해서 있는 사람인가~~ 본다(사용자 인증)
있으면 서버가 시크릿키를 통해 토큰을 발급해서 클라이언트에 전달
이후 사용
토큰은 브라우저의 로컬스토리지/쿠키(아래 내용이랑 상반됨)/세션스토리지에 저장되어있다
클라이언트가 서비스 요청시 헤더에 JWT함께 실어보냄
Authorization: Bearer token
JWT가 인증된 애라는데 얘를 서버가 또 검증을 한다고???? es256.verify 이런걸 통해서 검증을 하는데.. 이거는 db에 가야하고 그런게 아니라서 빠르고 간편한건가? 쿠키나 세션보다? 검증하고 나서 access를 발급하던데 코드가 혼란의 흔적 🤢
그니까 시크릿키를 통해서만 이제 검증을 하면된까 더 낫단건가... 세션이나 쿠키가 뭐가 그렇게 못하다는거지 그럼..?조작?보안?
➡️ 브라우저에 저장된 액세스 토큰을 통해 인증된 사용자라는 것을 서버측에서 알 수 있고 (검증verify)
별다른 인증절차없이 토큰만으로 뭐가🤢 검증이 가능하니꽈 사용하지
https://jwt.io/
https://velog.io/@hahan/JWT%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80