Stripe 도입기와 암호화 알고리즘

Taesoo Kim·2024년 10월 28일

Stripe가 뭔디

Stripe는 페이팔과 같은 PG 서비스인데, 원래 페이팔이 장악하고 있던 시장을 낮은 수수료와 DX(Development Experience)로 시장 점유율을 늘리고 있는 회사

정말 편하다

페이팔에 비해 Stripe는 개발이 극도로 편하다는 장점이 있는데, 9단계였던 페이팔의 구조를 3단계로 줄여버렸다.

스트라이프의 가장 기본적인 결제 방법은,

  1. 클라이언트에서 서버에 결제 요청을 한다.
  2. 서버는 스트라이프에 client secret를 포함한 Intent키를 생성해 클라이언트에 전달한다.
  3. 클라이언트는 client secret을 받아 스트라이프에 결제 요청한다.

db와 연동을 한다면 이런 모습일거다.

3번 까지는 위와 동일하고, 결제후 클라이언트가 succeeded라는 응답을 받으면, 그 신호를 서버에 보내기만 하면 된다!

보안이 생명

결제 로직은 보안이 굉장히 중요하다. Stripe는 Intent Object를 통해서 client secret을 관리하고, 멱등성을 보장한다 -> 결제는 무조건 한번만 되게 한다는 말. api 가 다중으로 와도, 최초 성공만 처리하게끔 설계되었다 한다.

또한, 웹훅(콜백)에서 패킷 탈취 공격인 Replay Attack을 방지하기 위해 타임스탬프서명검증을 통해서 안정하게 transaction을 처리한다.

보안 알고리즘들

AES(Advanced Encryption Standard)

비밀키를 사용해 데이터를 암호화하고, 동일한 키로만 복호화할 수 있는 방식

  • 키 확장(Key Expansion): 암호화 키가 여러 하위 키로 확장됩니다.
  • 대입(Substitution): 각 블록의 바이트를 S-box라는 대체 표를 사용해 변환합니다.
  • 행 이동(Shift Rows): 블록 내부의 행들을 특정 방식으로 이동시켜 데이터의 위치를 섞습니다.
  • 열 혼합(Mix Columns): 데이터의 열을 수학적으로 조합해 데이터 구조를 복잡하게 만듭니다.
  • 라운드 키 추가(AddRoundKey): 현재 블록에 암호화 키를 XOR 연산으로 추가하여 암호화 과정을 마무리합니다.

라고 하는데, 뭐 로직을 구현할것도 아니고 거의 모든 언어의 표준 라이브러리에서 지원하고 있으니 알차게 활용하자.

문제는 AES는 비밀키가 뚫리면 다 무용지물이 되니 비밀키를 잘 보관 할 것.

RSA(Rivest-Shamir-Adleman)

공개 키 암호화 알고리즘으로, 비대칭 키를 사용하여 데이터를 암호화하고 서명하는 방식

  1. 키 생성:
    • 두 개의 큰 소수 p와 q를 선택하고, 이들의 곱 n=p×q 를 계산하여 공개 키와 개인 키의 기준으로 삼습니다.
    • n의 오일러 함수 값을 계산하고, 암호화 지수 e를 선택하여 공개 키로 사용합니다.
    • 개인 키 d는 특정한 수학적 방식(모듈러 역산)을 통해 구해지며, 이는 공개 키의 짝으로 개인 키 역할을 합니다.
  2. 암호화:
    • 메시지를 수신자의 공개 키 (n,e)로 암호화합니다.
    • 메시지 MMM을 공개 키로 암호화하여 C=M^e * mod  형태로 암호화된 텍스트 C를 생성합니다.
  3. 복호화:
    • 수신자는 자신의 개인 키 ddd를 사용하여 암호화된 메시지 C를 복호화합니다.
    • M=C^d mod  n 방식을 통해 원래의 메시지 M을 복원합니다.
  4. 디지털 서명:
    • 송신자는 메시지를 개인 키 d로 서명하고, 수신자는 공개 키 e로 서명을 검증하여 해당 메시지가 진정한 발신자로부터 왔음을 확인할 수 있습니다.

라고 한다.

ECC(Elliptic Curve Cryptography)

타원 곡선의 수학적 구조를 이용하여 데이터의 보안을 제공하는 기술이다. ECC는 RSA와 같은 전통적인 공개 키 암호화 방식에 비해 더 작은 키 크기로 같은 수준의 보안을 제공하므로, 효율적인 암호화 방식

  1. 타원 곡선:
    • 타원 곡선은 특정 방정식을 만족하는 평면상의 점들의 집합으로 정의됩니다. 일반적으로 다음과 같은 형식으로 표현됩니다: y^2 = x^3 + ax + b
    • 여기서 a와 b는 곡선의 형태를 결정하는 상수입니다.
  2. 점의 덧셈:
    • 타원 곡선에서의 점 덧셈은 일반적인 덧셈과는 다릅니다. 두 점 P와 Q가 주어졌을 때, 이들을 더한 결과인 R는 타원 곡선 위의 또 다른 점입니다. 이 과정은 특별한 기하학적 방법을 사용하여 수행됩니다.
  3. 스칼라 곱:
    • 점 P와 정수 k가 주어졌을 때, P를 k번 덧셈하는 과정을 스칼라 곱이라고 합니다. 이는 ECC의 핵심 연산으로, kP와 같은 형태로 표현됩니다.

SHA(Secure Hash Algorithm)

뭐 다 알고 있는 해시 함수를 이용한 암호화. 비가역성이 가장 큰 특징

  • SHA-1:
    • 160비트 해시값을 생성
    • SHA-1은 1995년에 개발되었으며, 이전에는 널리 사용되었으나 현재는 안전하지 않다고 여겨짐
    • 충돌 공격에 취약한 취약점을 가지고 있어, 안전한 용도로는 권장되지 않음
  • SHA-2:
    • SHA-2는 SHA-256, SHA-384, SHA-512 등의 변종으로 구성
    • 각각 256비트, 384비트, 512비트의 해시값을 생성
    • SHA-2 계열은 현재 보안 요구 사항을 충족하기 위해 널리 사용되는 알고리즘
    • SHA-256은 가장 일반적으로 사용되는 버전으로, 안전한 데이터 통신, 디지털 서명, 데이터 무결성 등 다양한 보안 응용에서 활용 중
  • SHA-3:
    • SHA-3는 2015년에 발표된 최신 버전으로, Keccak 알고리즘을 기반
    • SHA-3은 SHA-256과 비교했을 때 구조와 알고리즘이 다르며, 224비트, 256비트, 384비트, 512비트의 해시값을 생성
    • SHA-3는 암호 분석에 대한 최신 연구 결과를 반영하고 보안성이 검증된 알고리즘으로 인정받고 있음

그래도 서버는 털리기 쉽다

  1. 거래 내역은 웬만하면 암호화 해서 저장하자.
  2. PG에서 오는 성공 여부는 믿지말고, 귀찮더라도 한번 더 조회해서 대조를 해보자.
  3. API 리미트는 꼭 걸어두자.
  4. ???
profile
뭔 생각을 해. 그냥 하는 거지 뭐

0개의 댓글