우리네 장

하이브리드 앱에서 Sticky Session 유지하기 ! 본문

작업/온라인 아카데미

하이브리드 앱에서 Sticky Session 유지하기 !

qpmi1zm29 2023. 12. 30. 16:04
온프라미스 환경에서 클라우드 환경으로 인프라를 전환하면서, 서버를 이중화로 구축하였습니다.
세션 공유 정책으로 Sticky Session을 사용하기로 하였으나, 하이브리드 앱의 특성으로 인해 험난했던 여정을 소개합니다..
※ 작성자에게만 험난할 수 있음.. ※

 

왜 Sticky Session ?

 

일단 다양한 세션 정책 중 왜 Sticky Session을 사용하였을까요??

아래 이미지는 저희가 사용했던 인프라 구성도를 대략적으로 작성해 본 것입니다.

관리자용 사이트는 private ALB를 사용하여, 일반 사용자가 접근하지 못하도록 구성하였고, 

일반 사용자 분들은 public ALB를 통해 이중화 된 서버에 접근하도록 하였습니다.

 

이때 저 ALB Group 내 WEBWAS1 과 3 의 세션을 유지하도록 해야 했는데요. 최근 Redis와 같은 인메모리 스토리지를 이용해 Tomcat 세션을 공유하는 방식을 많이 쓰지만, 저희는 기능적인 성격으로 인해 AWS ALB에서 제공해주는 Sticky Session 정책을 채택하게 되었습니다.

 

아래 이미지는 이미지를 첨부하여 게시글을 등록하는 흐름을 표현한 것입니다.

사용자가 단말기 갤러리에서 이미지를 선택해 첨부하게 되면, 네이티브 단에서 byte 데이터를 이미지 저장 API를 호출해 서버의 특정 디렉토리 경로 ( /AA/B/C ) 에 저장합니다.

 

이후 사용자가 게시글을 작성한 뒤, 게시글 저장 버튼을 클릭하여 클라이언트 단에서 서버에 게시글 저장 API를 호출하면, 서버에서 /AA/B/C 경로에 저장한 이미지 데이터를 S3와 같은 외부 Storage에 저장함과 동시에 데이터베이스에 게시글 정보를 저장합니다.

 

즉, 위 로직에서는 한 기능에 대해 2번의 트랜잭션을 수행하게 되고, 이중화 된 각 장비에 업로드 할 이미지저장하기 때문에, 사용자의 세션 정보 뿐만 아니라 사용자가 업로드한 이미지도 공유하고 있어야 했습니다.  그래서 key - value 형식으로 데이터를 저장하는 Redis를 채택하지 못하였습니다.

 

이에 대한 대안으로, 한 기능에 대해 한 번의 트랜잭션으로 기능을 완료할 수 있도록 구성하거나,
이미지 파일 자체를 업로드 하는 것이 아닌, 이미지를 바이트 데이터 형식으로 관리하면 Redis를 사용하여 무중단 배포를 구현할 수 있지 않았을까 하는 아쉬움이 남습니다..ㅠ

 

 

차안으로 NFS를 사용해 각 장비의 특정 디렉토리 ( /AA/B/C )  를 공유 디렉토리로 설정하려고 하였으나, 보안적인 이유로 사용하지 못하게 되었습니다.

 

NFS ? ( Network File System )
- 네트워크에서 파일 시스템을 공유할 수 있도록 설계된 파일 시스템으로,
 다른 서버의 파티션을 로컬 영역인 것처럼 공유하여 사용할 수 있다.

 

 

근데.. 제 예상과 다르게 해당 기능 작동 시 Sticky Session이 정상 작동 하지 않았습니다..!!!

 

 

📝 문제 상황

 

예시로 든 게시글 업로드 API를 호출 할 때, Sticky Session이 정상 작동 하지 않았습니다.

 

아래 이미지처럼, 이미지 저장은 A 서버에다 하고, 

이후 사용자가 게시글 저장 버튼을 누르면 해당 요청은 B 서버로 갔던 것이죠..

 

저희는 처음에 ALB에 문제가 있다고 생각하며 애꿏은 인프라 설정만 계속 확인하였습니다..

 

그러나 원인은 완전 다른 곳에 있었습니다.. 제가 하이브리드 앱의 특징을 이해하지 못하고 있었던 것이죠 😭😭

 

 

 

원인 파악 👍

 

일단 저희 회사에서는 하이브리드 형태의 앱 어플리케이션을 사용하였습니다.

아래 이미지처럼, 네이티브에서 웹뷰를 사용하여 웹의 기능을 사용하는 것인데요.

 

웹뷰는 작은 웹 브라우저라고 생각할 수 있습니다. 그 성격 덕에 모바일 단말기의 ip가 수시로 변경되어도 쿠키를 유지할 수 있게 되며, 이 위에서 HTML, CSS, JS와 같은 클라이언트 파일들이 실행됩니다.

 

그러나 웹뷰와 네이티브 영역은 서로 통신은 하지만, PC 상에서 서로 다른 웹 브라우저를 띄운 것과 같다고 하더라구요.

즉, 클라이언트 코드에서 ajax 등을 통해서 서버와 통신 할 때 생성되는 SESSION ID가 네이티브 단에는 공유되지 않는다는 얘기 입니다.

 

아까 이미지에서 보았듯이,

두 번의 호출은 쿠키에 저장된 세션 정보를 공유하지 않기 때문에,  ALB 입장에서는 서로 다른 요청자에게서 들어온 요청이라고 인식이 되고, 

저희가 설정했던 Sticky Session 은 RR ( Round Robin ) 방식으로 동작하였기 때문에, 한 서버에 이미지를 저장하면, 이후 들어온 요청은 다른 서버로 전달하게 된 것입니다.

( 개발 장비에서 단 건으로 기능 테스트를 하였을 경우 )

 

 

 

다행히 원인 파악 후, 네이티브와 클라이언트 단에서 해당 모듈의 수정을 통해 쿠키 세션을 유지할 수 있었습니다! 🎉🎉