들어가며
현재 서비스중인 앱의 세션 상태가 불안정한 이유로, 캐시서버로 토큰관리 전략을 하고있기에 운영중인 AWS ElasticCache RedisOSS에 접근하여 확인해보기로 했다.
먼저 여느때와 다름없이 외부에서 접근하기 위해 인바운드 규칙을 추가하여 레디스 인사이트에서 접근해보니 연결이 안되는 것이다.
Public Subnet에 있는 일반적인 RDBMS나 SSH로 서버접근 등은 인바운드 규칙을 추가하는 것만으로도 가능한데,
AWS ElastiCache(OSS Redis)는 기본적으로 VPC(Virtual Private Cloud) 내부 전용 서비스이기때문에,
퍼블릭 IP 자체가 존재하지 않는다. 이 때문에 단순한 외부접근이 불가능하다.
외부(로컬 PC 등)에서 직접 붙을 수 없으므로, Bastion EC2 를 경유해 SSH 터널링으로 접근해야한다.
Bastion IP: Private Subnet 에 있는 EC2나 RDS 혹은 ElasticCache 같은 리소스는 외부 인터넷에서 바로 접근이 불가능함.
그래서 Public Subnet에 하나의 중간용 EC2 (Jump Server, Bastion Host) 를 띄워두고,
이 서버를 통해서만 Private Subnet 내부로 SSH 접속을 하는 구조를 만든다.
여기서 EC2의 Public IP가 Bastion IP이다.
흐름:
[Local] --SSH(22)--> [Bastion EC2] --VPC 6379--> [ElastiCache Redis]
Redis를 인터넷에 노출하지 않으며, 트래픽은 TLS로 암호화된다.
그리고 당연한 말이지만, EC2 Bastion Host를 통해 ElasticCache에 접근하려면 중계해주는 EC2와 ElasticCache가 같은 VPC에 있어야한다.
TLS (Transport Layer Security): 데이터를 전송할 때 중간에서 훔쳐보거나 조작 못 하게 암호화해주는 프로토콜
HTTP, SMTP, Redis, MySQL 등 TCP 기반 통신을 보안화할 때 거의 항상 TLS가 붙는다.
(예: https://, rediss://, smtps:// 등)
보안그룹 설정
Bastion EC2 (인바운드)
| Type | Port | Source |
|---|---|---|
| SSH | 22 | 내 공인 IP |
ElastiCache Redis (인바운드)
| Type | Port | Source |
|---|---|---|
| Custom TCP | 6379 | Bastion EC2의 보안그룹 |
AWS 콘솔에서 로컬에서 EC2로 접근하기 위해 22번 포트를 열어주고, Elastic Cache에서는 EC2를 통해 접근하기위해 EC2의 Public IP에 대하여 레디스 기본포트인 6379를 열어준다.
SSH 터널링
터미널에서 아래 명령을 실행한다. 터널 세션 창은 무반응이면 정상이며, 열린 동안 통로 역할을 한다.
ssh -i <PEM키경로>.pem \
-N -L 6379:<ElasticCache 호스트 주소>:6379 \
<EC2 Username>@<Bastion IP(EC2 Public IP)>
-i: PEM 키 경로-N: 원격 명령 실행 없이 포워딩만-L:로컬:6379 → 원격Redis:6379포워딩
연결 테스트
ElastiCache가 TLS를 사용하므로 TLS 옵션을 반드시 붙인다.
redis-cli --tls --sni <ElasticCache 호스트 주소> \
-h 127.0.0.1 -p 6379 PING
정상일 경우 아래와 같이 출력될 것이다.
PONG
참고로 비밀번호 인증이 필요한 경우 -a '<PASSWORD>' 를 추가한다.
RedisInsight 설정
-1761617930812.png)
- Host -
127.0.0.1 - Port -
6379 - Username - 설정한 Username (기본값 default)
- Password - 비움(무인증일 때) 또는 토큰
- TLS(SSL) - 활성화
- SNI(Server name)
<ElasticCache 호스트 주소>
해당 이미지 아래에 Use SSH Tunnel 옵션이 있는데 본인은 pem키 인식이 되질않아 위와 같은 cli 명령어 방식으로 했다.
위와 같이 설정하고 Test Connection을 눌러보면 정상적으로 접근이 되는 것을 확인해볼 수 있다.
마치며
레디스에 접근하여 리프레시 토큰이 화이트리스트에 잘 등록되어있고 액세스 토큰도 블랙리스트로 등록이 잘 된 것을 확인하고 서버사이드에는 문제가 없는 걸로 확인이 되었다. 이후 클라이언트 사이드에서 문제를 해결하면 앞서말한 앱의 불안정한 세션 문제를 해결 할 수 있을 것 같다.