HTTP 200 OK

Memento mori & Carpe diem

CS

Decode, Encode, Parse, Stringify 개념과 사용

sjoongh 2024. 2. 17. 16:15

웹 개발을 하다보면 데이터 변환에 대한 경험을 반드시 마주하게 됩니다.

 

Decode, Encode, Parse, Stringify 와 같이 데이터 형식을 변화시키는 것에 대한 정확한 개념과 언제 사용해야 하는지에 대해 작성해보려고 합니다.

 

평소 깊게 생각하지 않고 상황에 따라 사용해왔기에 개념 정리를 해보려고 합니다. 예시로 작성된 코드는 파이썬입니다.

 

Decode

디코드는 변형된 형태로 저장된 데이터(인코딩 데이터)를 원래 상태로 되돌리는 것을 말하며 이를 복호화 라고 합니다.

예를 들어 텍스트를 Base64로 인코딩한 경우, 디코딩은 Base64로 인코딩된 텍스트를 다시 일반적인 ASCII나 유니코드 텍스트로 변환하는 것을 말합니다.

import base64

encoded_text = 'SGVsbG8gV29ybGQh'
decoded_text = base64.b64decode(encoded_text).decode('utf-8')
print(decoded_text) # Hello World

 

Encode

  • 인코드는 데이터나 정보를 특정한 형식이나 규격에 맞춰 변환하는 과정을 말합니다.
  • 주로 데이터를 효율적으로 저장하거나 전달하기 위해 사용됩니다.
  • 예를 들면 특정 문자의 집합을 ASCII나 UTF-8 형식으로 인코딩 하는 것입니다.
import base64

text = 'Hello World!'
encoded_text = base64.b64encode(text.encode('utf-8')).decode('utf-8')
print(encoded_text) # SGVsbG8gV29ybGQh

 

Parse

  • 파싱은 주로 문자열이나 데이터를 해석하고, 그것을 의미 있는 부분으로 분해하는 과정을 의미합니다.
  • 예를 들면 XML이나 JSON과 같은 데이터 형식을 파싱하여 프로그램이 해당 데이터를 읽고 이해할 수 있도록 합니다.
import json

json_data = '{"name": "John", "age": 30, "city": "New York"}'
parsed_data = json.loads(json_data)
print(parsed_data['name']) # John
print(aprsed_data['age']) # 30
print(parsed_data['city']) # New York

 

Stringify

  • 스트링화는 객체나 데이터를 문자열 형태로 변환하는 과정을 의미합니다.
  • 주로 객체를 텍스트로 표현할 때 사용되며, 일반적으로는 해당 객체를 표현하는 문자열로 변환합니다.
  • 예를들어 JSON.stringify() 함수는 JS에서 객체를 JSON 문자열로 변환하는데 사용합니다.
import json

data = {'name': 'John', 'age': 30, 'city': 'New York'}
json_string = json.dumps(data)
print(json_string) # '{"name": "John", "age": 30, "city": "New York"}'

 

특징

이러한 용어들의 주요 차이점은 주로 데이터의 변환과 해석 과정에서 나타납니다.

  • Encoding/Decoding 는 데이터를 다른 형식으로 변환하는 데 사용되고
  • Parsing은 데이터를 해석하고 분해하는 데 사용되며
  • Stringify는 데이터를 문자열 형태로 변환하는데 사용됩니다.

 

URL 인코딩/디코딩

Encoding/Decoding의 가장 흔한 사용사례는 URL을 보면 사용하는 이유를 알 수 있는데 URL에 인코딩 하는 방식을 ‘퍼센트 인코딩’ 이라고 부릅니다.

 

이렇듯 주로 웹 애플리케이션에서 사용자의 입력이나 서버 간에 데이터를 전달할 때 주로 사용합니다.

 

URL은 ASCII 문자열 기반의 문자 집합만을 허용하므로 특수 문자나 공백, 한글 같은 문자들을 안전하게 적용하려면 인코딩이 필요합니다.

import urllib.parse

url = '<https://example.com/search?q=hello> world'
encoded_url = urllib.parse.quote(url)
print(encoded_url)
# 출력: https%3A//example.com/search%3Fq%3Dhello%20world

decoded_url = urllib.parse.unquote(encoded_url)
print(decoded_url)
# 출력: <https://example.com/search?q=hello> world

 

JWT 토큰 구현

JWT 토큰에서 또한 페이로드에 사용자의 정보를 저장하고 서명을 통해 인증을 보장합니다. 이 때 페이로드는 보통 Base64로 인코딩된 형태로 전송합니다.

 

또한 서버에서 생성한 secretKey와 함께 사용한다면 보안측면에서 더 유리합니다.

import jwt

# 사용자 정보
user_info = {'user_id': 12345, 'username': 'poter'}

# 시크릿 키
secret_key = 'my_secret_key'

# JWT 토큰 생성
token = jwt.encode(user_info, secret_key, algorithm='HS256')
print(token)

# JWT 토큰 디코딩
decoded_token = jwt.decode(token, secret_key, algorithms=['HS256'])
print(decoded_token)

 

 

추가적으로 인코딩/디코딩에 대한 역사나 작동원리가 궁금하신분은 자세한 설명이 적혀있는 블로그가 있어 공유합니다. https://brunch.co.kr/@simplebrunch/13

'CS' 카테고리의 다른 글

event storming이란?  (1) 2024.04.28
Nginx Proxy vs API Gateway(Part. 2)  (0) 2023.12.20
Nginx Proxy vs API Gateway(Part. 1)  (0) 2023.12.09
Connection Pool 테스트와 고찰(2)  (0) 2023.11.07
Connection Pool 테스트와 고찰(1)  (0) 2023.11.07