질문을 삭제하지 말아주세요.!
 
1
0
-1

안녕하세요.

Laravel 5.4 에서 API 서버를 구축하고 있습니다.

http://l5.appkr.kr/lessons/50-id-obfuscation.html

위 url을 보고, ID 난독화를 진행하고 있는데, 

모든 api model의 id를 난독화하기 위해서, 추상화되어있는 model 에서 getIdAttribute 에서 encode 를 했는데, 

그 오브젝트가 hasMany로 가지고 있는, 다른 오브젝트에서도 난독화된 ID가 들어가서 에러를 발생시키더군요.


그래서, 다른 방법으로 접근을 해야할거 같은데, 

객체가 다른 객체의 배열을 가지고 있기도 하고, 모든 model의 id를 난독화하고싶을때는 어떻게하는게 좋을까 해서

질문드려봅니다.  미리 답변에 감사드립니다. 

    CommentAdd your comment...

    1 answer

    1.  
      1
      0
      -1

      (아이고 답변 쓰다가 날아가서, 코드 에디터에서 다시 써서 붙입니다. 망할 컨플루언스~ 제 회사에서 자주 발생하는 일이라..)
      목적하시는 바를 달성하기 위해서 현재 가장 현명한 방법은 uuid 컬럼을 이용하는 방법이라 생각합니다.

      https://laravel.kr/docs/5.4/migrations#creating-columns

      1) 이미 서비스를 운영 중이시라면 기존의 PRIMARY KEY를 드롭하고, uuid를 PRIMARY KEY로 등록하는 마이그레이션이 필요합니다.

      2) \Illuminate\Database\Eloquent\Model 클래스를 참고해서 uuid를 사용하는 모델 클래스에서 오버라이드해야할 멤버 변수는 오버라이드해 줘야 합니다.  (예: public $incrementing = true;)

      3) 36byte 문자열을 기본 키로 사용하기 때문에, 이 테이블의 uuid를 외래 키로 사용하는 테이블에서 무조건 외래키와 인덱스를 걸어야합니다. 귀찮다고 안하시면 피크 타임에 심각한 성능 저하 또는 데드락이 발생할 수 있습니다.
      4) 정수형 기본 키 대비 읽기/쓰기 할 때 약간의 성능 차이가 있을 거라 예상됩니다.

      레코드 수가 천만개 이상되는 테이블에 uuid를 적용해 본 적이 없는데요. 해 보시고 경험을 공유해 주시면 다른 분들에게도 많은 도움이 될 듯 합니다.


      1. yc

        답변 감사합니다. 

        아직 서비스를 시작하지 않았지만, 어지간하면 작업해둔 코드를 들어내면.. 일정상 차질이 생길까 하여 짱구를 좀 굴려보니,  이런 방법은 어떨까 해서 자문을 구해봅니다.

        1) Custom route middleware 를 두고, 해당 Middleware에서 들어오는 "id"식별자를 찾아서, decode한다.

        2) Response줄때, 역시 id식별자를 찾아서, encode 해서 내보낸다. 

        대충 이렇게 1,2번으로 가장 앞단과 가장 뒷단에서 처리를 해서 하면 될거 같은데 1번이 조금 걸리네요. Laravel 입문 2주차라.. 저게 가능할련지가 의문입니다. ㅠㅠ

      2. 정광섭

        김주원님 질문과는 상관없는 댓글인데 confluence에서 페이지 작성할 경우 서버에 주기적으로 자동으로 드래프트를 남겨놓으니 날릴 경우 저장된 버전을 복구해서 사용하면 됩니다. (enterprise 용 제품이라 그리 허접하지는 않더라구요 ^^)


        사용자들이 그런 일 자주 겪을 경우 confluence 사용 자체를 꺼릴 수 있으니 해당 기능에 대해서 한번 공지해 보세요. 


        드래프트 사용법은 https://www.lesstif.com/pages/viewpage.action?pageId=26084462 를 참고하세요.

      3. 김주원

        정광섭 형님 링크 고맙습니다~

        yc 말씀하신 시나리오는 가능할 듯 한데, 해 보지 않아서 확답은 못 드리겠네요. 시도해 보시고 또 업데이트해주세요.

      CommentAdd your comment...