본문 바로가기
카테고리 없음

230211 TIL

by hbIncoding 2023. 2. 12.

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

 

Base64 이해와 Base62 비교

Base64와 Base62 란 바이너리 데이터를 문자집합 각각 64개, 62개를 기준으로 하여 변경하는 인코딩/디코딩 방식을 이야기합니다. 인코딩이라 하면 일반적으로 동영상 인코딩을 많이 들어보셨을 겁

nhj12311.tistory.com

 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

 

JWT 토큰 암호화 알고리즘 - HS256과 RS256

이 글에선 JWT 토큰의 전체적인 동작 방식에 대한 내용은 다루지 않고, 암호화 알고리즘에 대해서만 다루도록 하겠습니다. JWT 토큰 암호화 알고리즘 중 대표적인 HS256, RS256에 대해서만 다루겠습

velog.io