Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

Sqids: RAD 서버에 내장됨 그리고 독립형 라이브러리로도 제공됨


Recommended Posts

Antonio Zapater"Sqids: Integration with RAD Server and standalone library" 를 번역했습니다. (원문 작성: 2023년 12월, 최종 번역: 2024년 1월)

RAD 스튜디오 12의 출시와 함께, RAD 서버에는 인코딩 Sqids 라이브러리가 완전히 통합되어 내장되었다. 뿐만 아니라 이 라이브러리를 다른 프로젝트에서 사용할 수 있도록, System.NetEncoding.Sqids 네임스페이스 안에 TSqidsEncoding 클래스가 새로 추가되었다.

인용하기

Sqids는 소규모 오픈 소스 라이브러리이다. 이 라이브러리를 사용하면 짧고, 고유하고, 무작위로 보이는 ID를 숫자로 생성할 수 있다.  이것을 이해하려면, 10진수를 16진수로 바꾸는 변환기 비슷한데 몇 가지 부가 기능들이 있는 것이라고 생각하면 좋다.

Sqids 웹사이트

RAD 스튜디오 12에는 이 라이브러리가 있기 때문에, Sqids의 초고속 알고리즘을 사용할 수 있다. 따라서 모든 플랫폼에서 네이티브로 숫자 또는 숫자 배열을 인코딩하고 디코딩할 수 있다. 뿐만 아니라 Sqids는 표준화 되어있기 때문에 다른 프로그래밍 언어와도 완전히 호환된다. Sqids 웹사이트에서  사용 가능한 언어들을 확인할 수 있다. 

목차


TSqidsEncoding 사용법

작성 중인 유닛 안에서, 네임스페이스 System.NetEncoding.Sqids를 포함하고 새 오브젝트를 초기화하기만 하면 된다. 알파벳과 길이를 직접 지정하기를 권장한다. 그렇게 하면, ID를 디코딩하기가 훨씬 더 어려워진다.

간단한 예시를 살펴보자:

procedure CreateSqids;
begin
  var length := 10;
  var alphabet := 'JXx6Ue7jLqBk9cZmwA2szgdYNRP4lhOErDvQF1GTVIM3fao5t8WuSb0HyipKnC';
  var sqids := TSqidsEncoding.Create(alphabet, length);
  var encoded := sqids.Encode(1034); // 인코딩된 값은 '6GRy4cbTSV'가 된다. 
  var decodedSingle := sqids.DecodeSingle(encoded); // 디코딩된 값은 해당 값이 포함된 정수가 된다: 1034
  var decoded := sqids.Decode(encoded); // 디코딩된 값은 배열인데, 그 안에는 하나의 값이 있다: 1034
  lSqids.Free;
end;

Sqids를 사용하면, 숫자 또는 숫자 배열을 YouTube-식 문자열로 빠르게 인코딩할 수 있다. 지정된 문자와 길이는 인코딩할 때 사용된다.  TSqidEncoding 안에는 여러 가지 메서드들이 들어 있기 때문에, 우리는 훨씬 더 유연하게 사용할 수 있다. 하지만 개념적으로는 매우 쉽고 사용법도 간단하다.

 

RAD 서버에 내장된 Sqids

RAD 서버에 내장된 기능은 Sqids를 쉽게 사용할 수 있게 해준다. TEMSDatasetResource를 사용할 때, 애트리뷰트(attribute) 안에서 ID 앞에 기호 #을 지정해주기만 하면, 나머지는 RAD 서버가 알아서 처리한다.

Customers(고객) 엔드포인트를 게시한다고 가정해보자. 프라이머리 키인 CUST_NO에서 Sqids를 사용하려고 한다면, 다음과 같이 하면 된다:

  [ResourceName('Customers')]
  TCustomersResource = class(TDataModule)
    qryCustomers: TFDQuery;
    [ResourceSuffix('list', '/')]
    [ResourceSuffix('get', '/{#CUST_NO}')]
    [ResourceSuffix('put', '/{#CUST_NO}')]
    [ResourceSuffix('post', '/')]
    [ResourceSuffix('delete', '/{#CUST_NO}')]
    resCustomers: TEMSDataSetResource;
    FDConnection1: TFDConnection;
  end;

RAD 서버는 URI 수준에서만 디코딩을 한다는 점을 아는 것이 중요하다. 즉, 응답 본문은 인코딩되지 않는다. RAD 스튜디오로 클라이언트 애플리케이션을 개발하는 경우, EMSProvider 컴포넌트 안에서 알파벳 및 길이 프로퍼티를 정의하면 된다. 그러면 그 요청이 자동으로 인코딩된다. (이 페이지 끝에 있는 데모 프로젝트를 확인하자)

RAD 서버에서 사용하는 알파벳과 길이를 커스타마이징 하려면 EMSServer.ini 안에 있는 두 가지 새 프로퍼티들을 찾아서 값을 지정한다.

[Server.Sqids]
;# The following options control URL parameters Sqids decoding
;#
;# Optional alphabet for Sqids decoding
Alphabet=
;# Optional minimal hash length for Sqids decoding
MinHashLength=0

Sqids를 사용하기 적합한 상황은 무엇일까?

REST API를 개발하거나 여러 서비스들 끼리 서로 통신하는 경우, 엔드포인트의 ID가 명백히 드러나는 것을 아마도 원하지 않을 것이다. 대부분의 경우 이런 엔드포인트는 테이블의 프라이머리 키이다. 따라서 봇(bot)을 사용해 데이터를 수집하려고 하는 자들의 타겟이 될 가능성이 크다. 또 다른 좋은 사례는, 잠재적인 보안 문제를 최소화하기 위해 squis를 사용하는 것이다. (버그때문에), 엔드포인트 중 하나가 절절하게 보안 처리되지 않았다고 생각해 보자. 증분하는 숫자 ID를 사용하고 있다면, (제공되면 안되는) 데이터에 접근하는 것이 더 쉽다. 아이디를 난독화해야 하는 이유는 여러 가지이다. 그리고 Sqids를 이용하면 매우 간단하고 빠르게 할 수 있다.

Sqids를 사용하는 것은 안전할까?

Sqids 알고리즘의 본질은 빠르다는 것이다. 매우 빠르다. 본질이 그렇기 때문에, Sqids는 암호화 메커니즘이 아니다. 그리고 신용카드, 핀 번호 등등 민감한 데이터를 인코딩하는 데는 권장되지 않는다는 점을 잘 알고 있어야 한다. Sqids는 난독화를 통한 보안 방식을 따른다. 즉 데이터가 단순한 숫자 ID처럼 명백하게 노출되지 않도록 할 뿐이다. 따라서, 누군가 충분한 시간과 인내심을 가지고 접근한다면, 결국 ID를 디코딩하여 알아 낼 수 있다.

예제가 있는가?

그렇다! 깃허브에 프로젝트 2개를 만들어 두었다.

Sqids Playground 프로젝트

spacer.png

다운로드

이 파이어몽키 프로젝트 안에서, 다양한 파라미터를 사용해보고 결과를 실시간으로 확인할 수 있다. 기본 "Results"탭은 MemTable에 1000개의 행을 생성한다. 실시간으로 인코딩하는 속도가 얼마나 빠른지 볼 수 있을 것이다.  탭이 두 개 더 있다. 인코딩하고 디코딩 할 항목이 무엇인지 그리고 인코딩에 사용할 알파벳과 길이를 직접 지정할 수 있다. 버튼을 눌러보고, 재미있게 놀아보자!

RAD Server integration 프로젝트

spacer.png
다운로드

이 또 다른 프로젝트는 하나의 프로젝트그룹(ProjectGroup)이다. 그 안에는 RAD 서버 프로젝트와 VCL 애플리케이션 프로젝트가 들어 있다. 코드를 분석해보면, RAD 서버가 통신할 때 Sqids를 어떻게 구현하여 사용하는지 알 수 있을 것이다. 또한 ID를 어떻게 자동으로 인코딩 및 디코딩 할 수 있는지도 알 수 있다. 이 프로젝트는 데이터베이스에 연결되어 있으므로, FDConnection 안에서 employee.gdb를 지정해주어야 한다. (employee.gdb는 InterBase용 예제 데이터베이스 파일이다) 

추가 정보

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.