[태그:] Angular

  • [Angular]복호화(암호화 해제)

    Angular에서 암호화된 데이터 복호화(Decryption)

    백엔드(Node.js)에서 암호화된 데이터를 프론트엔드(Angular)에서 복호화하여 사용자에게 보여주는 방법을 정리했음.


    📦 1. crypto-js 모듈 설치

    Angular 프로젝트에서 crypto-js를 사용하려면 먼저 모듈을 설치해야 함.

    • 설치 명령어:
      npm i -d crypto-js

    • TypeScript 사용 시 추가 설치:
      npm i --save-dev @types/crypto-js


    🔑 2. 암호화/복호화 서비스 설정 (cryptoJs.service.ts)

    @Injectable() 데코레이터를 사용하여 CryptoJsService를 정의하고, 암호화 키를 설정했음.

    // cryptols.service.ts
    import { Injectable } from "@angular/core";
    import * as CryptoJS from "crypto-js"; // crypto-js 모듈 임포트
    
    @Injectable()
    export class CryptoJsService {
      private encryptionKey: string = "YOUR_ENCRYPTION_KEY"; // 암호화 키 설정. 실제 키로 대체 필요
    
      constructor() {}
    
      // 데이터 암호화 메서드 (Node.js와 동일한 방식으로 암호화)
      encrypt(value: string) {
        return CryptoJS.AES.encrypt(value, this.encryptionKey).toString();
      }
    
      // 데이터 복호화 메서드
      decrypt(value: string, isIpFormat: boolean) {
        // isIpFormat은 IP 형식을 체크하는 사용자 정의 함수일 수 있음
        let rtnValue = value;
        if (!isIpFormat) {
          // IP 형식이 아닌 경우에만 복호화 시도
          try {
            rtnValue = CryptoJS.AES.decrypt(value, this.encryptionKey).toString(CryptoJS.enc.Utf8);
            return rtnValue;
          } catch (e) {
            console.log(e, value);
            return rtnValue; // 에러 발생 시 원본 값 반환
          }
        } else {
          return rtnValue;
        }
      }
    }
    • encryptionKey: 백엔드에서 사용한 암호화 키와 동일해야 함.
    • decrypt 메서드는 isIpFormat이라는 추가 파라미터를 받아 특정 조건(!isIpFormat)에서만 복호화를 시도함

      이는 IP 주소와 같은 특정 형식의 데이터는 복호화하지 않기 위함으로 보임.

    💻 3. 컴포넌트에서 복호화 적용

    CryptoJsService를 컴포넌트에 주입하여 데이터를 복호화했음.

    // import {CryptoJsService} from "@app/core/service/cryptoJs.service"; // 서비스 임포트
    
    // constructor 등에서 서비스 주입
    // private cryptoJsService: CryptoJsService
    
    // 데이터 사용 예시
    // testdata.push(this.cryptoJsService.decrypt(test.testdata)); // 데이터를 복호화하여 사용

    이렇게 적용 시 일반적인 화면에서는 데이터가 정상 출력됨


    ⚠️ 4. 팝업창 복호화 문제 및 해결

    간혹 팝업창에서는 암호화된 데이터가 그대로 출력되는 문제가 발생할 수 있었음

    4.1. 문제 해결을 위한 추가 코드

    팝업창으로 데이터를 보낼 때 특정 데이터만 추출하여 다시 넣어주는 방식으로 해결했음

    // 팝업창으로 데이터를 보낼 때 적용
    if (e.colDef.field === "modi") {
      // 'modi' 필드에 해당하는 경우
      if (Array.isArray(e.data.test)) {
        // e.data.test가 배열인 경우
        let tests = [];
        e.data.test.map((ip) => tests.push(ip.testtest)); // 배열 내 객체에서 'testtest' 필드만 추출
        e.data.test = tests.toString(); // 추출된 데이터를 문자열로 변환하여 다시 할당
      }
      this.updateRow(e.data, e.colDef.field); // 행 업데이트
    }

    이 코드는 e.data.test가 배열이고 그 안에 testtest라는 필드를 가진 객체들이 있을 때, 해당 필드들의 값을 추출하여 하나의 문자열로 변환한 뒤 다시 e.data.test에 할당하는 로직으로 보임.
    이 과정을 통해 팝업창에서도 정상적으로 복호화된 데이터가 출력될 수 있도록 조치했음