티스토리 뷰

 얼마전 신입분의 질문으로 JSESSIONID부터 세션 클러스터링에 대해 알아보았는데(JSESSIONID에서 세션 클러스터링까지) 실습을 해볼 수 있으면 좋을 것 같아서 간단하게 도커로 환경을 만들어서 실습해본 내용을 정리한다.(Redis 클러스터링 실습 프로젝트 소스는 https://github.com/arajo-hub/redis-session-clustering-practice에. noclustering소스는 간단한 내용이므로 따로 업로드해두지 않았다.)

참고링크(https://zzang9ha.tistory.com/442)


도커로 Redis와 실습 프로젝트 인스턴스 2대를 돌린다.

 제일 먼저 도커로 Redis를 실행한다.

docker run -d --name my-redis-container redis

그리고 도커로 Redis와 연결된 실습 프로젝트를 실행한다.

docker run -d -p 8080:8080 --name session-clustering --link my-redis-container:redis session-clustering
docker run -d -p 8180:8080 --name session-clustering2 --link my-redis-container:redis session-clustering

이때, --link my-redis-container:redis 이 부분이 있기 때문에 도커에서 실행중인 redis와 도커에서 실행할 실습 프로젝트를 연결할 수 있다.(연결에 필요한 설정은 실습 프로젝트에 이미 되어 있다.)

 그리고 docker ps 명령어를 날리면 아래와 같은 결과를 확인할 수 있다.


 이제 실습을 할 수 있는데, /test로 id를 파라미터로 줬을 때 그 파라미터로 준 id는 세션에 저장되고, /check로 접근시 그 id를 꺼낼 수 있다. 8080/test로 먼저 id를 보내고, 8080/check로 id가 제대로 나오는지 확인한 후, 8180/check로도 동일하게 아이디가 잘 나오는지 확인되면 성공이다.

 아래처럼 /test?id=judy 했을 때 200 OK로 결과가 떨어졌다.

 컨테이너 내부에서 찍은 로그를 확인해보면 아래와 같다. session.getId()를 했을 때 bc320648-8d8d-4616-a1f9-3fee6e5d095e라고 표시되는데, 이 값을 BASE64 인코딩하면 YmMzMjA2NDgtOGQ4ZC00NjE2LWExZjktM2ZlZTZlNWQwOTVl이다. 결론적으로 우리가 개발자도구에서 확인하는 SESSION값은 session의 ID의 BASE64인코딩한 값이다.

 /check로 접근시 위처럼 아까 저장해둔 judy라는 id가 표시되고, SESSION에 변화가 없음을 알 수 있다. 그리고 8180/check로 접근하면 아래와 같이 같은 데이터가 나온다.(8180에서는 세션에 id를 저장하지 않았음에도) 그리고 세션도 동일하다.


클러스터링을 하지 않은 그냥 서버 인스턴스 두 대를 돌린다치자.

 위는 8280(noclustering)에서 test?id=judy했을 때이다. 간단한 실습이므로 id는 맵에 저장되도록 해놓았다.

그리고 다시 /check로 접근하면 아래와 같이 정상적으로 값이 나온다.

 그리고 8380(noclustering2)로 바로 check로 접근하면 noclustering2는 세션에 저장된 id가 없기 때문에 데이터가 null로 넘어온다. JSESSIONID도 8280과는 다르다.

noclustering2의 로그를 확인해보면 다음과 같다. (id가 없을 땐 id is empty. 로 남기도록 해놨다.)

300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함