Spring 심화 주차 2일차
1. 인코딩과 디코딩
- 컴퓨터는 문자를 인식할 수 없음으로 숫자로 변경되어 저장된다.
- 변환을 하기 위해선 기준이 있어야 하는데 이것을 문자 코드라고 하며 대표적으로 ASCII코드 또는 유니코드가 있다.
- 문자 코드를 기준으로 문자를 코드로 변환하는 것을 문자 인코딩(encoding)
- 코드를 문자로로 변환하는 것을 문자 인코딩(decoding)
1) Base64 이해와 Base62 비교
ㄱ. Base64
- 바이너리 데이터를 문자집합 각각 64개를 기준으로 변경하는 인코딩/디코딩 방식
- 대표적으로 이메일에 많이 사용하며, 인터넷 데이터 전송, 데이터 베이스 저장, 파일에 값 저장 등 사용
ㄴ. Base62
- 바이너리 데이터를 문자집합 각각 62개를 기준으로 변경하는 인코딩/디코딩 방식
- Base64에서 0~63번째까지 중 62번째인 = 와 63번 째인 / 을 각각 -와 _ 로 바꾸어 준게 Base62이다.
- 이렇게 특수문자를 제거하였을 때 URL이나 파일명으로 사용할 수 있게 된다.
- 즉 Base64의 URL and Filename safe 버전이 되는 것이다.
2. JWT(HS256과 RS256)
- JWT(JSON Web Token)는 base64 endoded string 3개가 점(.)으로 나누어진 토큰이다.
- 순서대로 header, payload, verify signatue이다.
- header에는 alg라는 key에 알고리즘 이름이 저장되어 JWT가 어떤 알고리즘으로 Hash되었는지 알수있다. JWT를 가진 서버와 클라이언트 모두 확인 가능하다.
- Verify signature에는 header와 데이터를 저장하는 payload를 "특정secret"으로 한 서명이 들어간다.
- secret을 가지고 있는 서버에서는 같은 방식으로 secret을 hash하여 header나 payload가 위변조 되지 않았는지 검증 할 수있다.
1) SHA-256 알고리즘
- 256비트로 구성되며 64자리 문자열을 반환한다.
- 이름에서 알 수 있듯 2^256만큼 경우의 수를 만들어 개인용 컴퓨터로 무차별 대입을 수행해 해시 충돌 사례를 찾으려고 할 때 많은 시간이 소요될 정도로 큰 숫자이므로 충돌로부터 비교적 안전하다고 평가받는다.
2) Hash 알고리즘
- 해쉬는 임의의 크기를 가진 데이터를 고정된 데이터 크기로 변화시키는 함수
- 해쉬 알고리즘을 유용하게 사용하기 위한 5가지 요구조건
- 단방향(One-way) : 해쉬 알고리즘은 복호화할 수 없다.
- 결정적(Deterministic) : 동일한 문서를 해쉬 알고리즘을 적용하면 똑같은 해쉬값을 얻어야 한다.
- 연산이 빨라야한다(Fast Computation) : 알고리즘을 잘 사용할 만큼 연산 속도가 빨라야 한다.
- 쇄도 효과(The Avalanche Effect) : 입력값에 아주 작은 변화에도 해쉬값이 완전히 달라지는 것을 의미
- 충돌 저항성(Must withstand collisions)
- 이름에서 알 수 있듯 2^256만큼 경우의 수를 만들어 개인용 컴퓨터로 무차별 대입을 수행해 해시 충돌 사례를 찾으려고 할 때 많은 시간이 소요될 정도로 큰 숫자이므로 충돌로부터 비교적 안전하다고 평가받는다.
1) HS256(HMAC with SHA-256)
- 대칭 키를 사용하는 암호화 방식이다.
- Base64(Header) + Base64(Payload) + secret key 가 점(.)단위로 나누어 져있다.
- Signature는 "Header + Payload + secret 값" 을 HS256 알고리즘으로 암호화된다.
- 성된 Header, Payload, Signature 로 JWT 토큰을 만들어 클라이언트로 보내고, 클라이언트는 로컬 스토리지에 토큰을 저장합니다
- 클라이언트는 서버에 요청이 있을 경우, 토큰과 요청 내용을 같이 보냅니다.
- 서버에서는 Header 와 Payload 를 Base64 알고리즘으로 복호화한 뒤, 서버만 알고 있는 개인키를 가지고 다시 HS256 알고리즘을 이용해 암호화해보고, 클라이어트에서 보낸 토큰과 같은지 유효성 검증을 합니다.
2) RS256(RSA with SHA256)
- 비 대칭 키를 사용하는 암호화 방식이다.
- 서버에서 Header, Payload 는 Base64로 인코딩된다.
- Header, Payload는 서버의 개인키로 암호화 Signature 를 만듭니다.
- 그리고 토큰을 만들어 클라이언트로 보낸다.
- 클라이언트는 서버에 요청을 보낼 때 토큰과 요청 내용을 같이 보낸다.
- 서버에서 토큰의 유효성을 검증하기 위해서, 공개키로 Signature를 복호화해본다.
- 비대칭키 암호화 알고리즘의 특징
- 공개키로 암호화한 것은 개인키로 복호화 가능(데이터 암호화 기능)
- 개인키로 암호화 한것은 공개키로 복호화 가능(전자서명 기능)
3. 참조 자료
1) Base64와 Base62의 차이 : https://nhj12311.tistory.com/389
2) HS256과 RS256 : https://velog.io/@ddangle/JWT-%ED%86%A0%ED%81%B0-%EC%95%94%ED%98%B8%ED%99%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-HS256%EA%B3%BC-RS256