본문 바로가기

SW 공부

[Redis] redis 를 이용한 global session 관리

기본개념

1. 쿠키/세션

 : 서버와 클라이언트는 계속 연결되어 있지 않기 때문에 서버에 오는 모든 요청마다 클라이언트가 누구인지 확인해야 한다.

매 요청마다 로그인 하는 과정을 반복한다고 생각한다면 너무 비효율적이므로, 한번 로그인 하면 일정 기간 동안 유효한 자유이용권을 하나 발급해준다.

참고 interconnection.tistory.com/74

 

2. 세션이 외의 인증방법

- 세션은 별도의 저장소가 필요하므로 많아지면 문제다. 세션ID(토큰) 에 전체 내용을 담아서 사용하는 방법 JWT

- 특정 서비스 외에 여러 서비스를 한번에 인증하여 사용하는 방법 OAuth

 

3. 대칭형, 비대칭형 암호화

- 대칭형은 1개의 키를 양쪽이 잘 주고 받아서 이 키로 암복호화를 하는 것, 키를 공유하는 과정에서 탈취당하면 끝

- 비대칭형은 2개의 키를 쌍으로 가지고 있어서, 공개키로 암호화한 것은 개인키로 복호화 가능하고, 개인키로 암호화한 것은 공개키로 복호화 한다.

- 비대칭형 암호화의 예시1 : 공개키를 상대방에게 전달하여 이것으로 암호화 해달라고 한다. 그리고 공유되지 않은 개인키로 복호화해서 사용 (개인키를 가진 사람만 볼 수 있다는 보안의 개념)

- 비대칭형 암호화의 예시2: 개인키로 암호화된 암호문을 공개키와 함께 전달한다. 이 암호문이 복호화에 성공한다는 것은 개인키로 암호화 한 것이 확실함을 인증 할 수 있다. (내가 암호화 한것이 확실하다는 인증의 개념)

 

4. SSL 인증 

- CA(인증기관) 은 CA 의 공개키는 미리 브라우저에 저장되어 있다.

- 브라우저가 서버에 접속하면 서버는 CA의 개인키로 암호화 된 인증서를 전달한다.

- CA 리스트 중에서 맞는 CA 를 찾아서 해당 공개키로 복호화 하면 그 안에 서버의 공개키가 들어있다.

- 이때 CA 의 공개키로 복호화에 성공 한 것은 CA 가 이 서버를 정상적인 서버로 인증한다는 것도 포함되어 있다.

- 이후 브라우저와 서버는 각각의 공개키와 개인키로 암복호화 하여 통신

참고 wayhome25.github.io/cs/2018/03/11/ssl-https/

 

세션 관리 방법

중복 로그인을 허용하는 범위 내에서 세션을 생성하고 삭제 할 때까지 어떤 과정으로 진행되는지 알아보자.

 

1. 로그인하여 세션 생성

인증(Authentication) - 데이터베이스의 사용자 정보와 클라이언트가 보낸 정보가 일치하는지 확인

세션 객체와 uuid 생성 후 이것을 토큰key 로 redis 에 set 하고 만료시간을 설정 - 세션 객체는 문자열로 직렬화

사용자의 세션이 여러개 발생 할 수 있으므로 redis 에 사용자 세션 sets 를 관리

 

2. 요청시 세션 확인 및 만료시간 갱신

클라이언트가 보낸 토큰으로 redis 에서 get(토큰) 하여 세션을 가져온다. - spring 에서는 HandlerInterceptor 이용

유효하면 만료시간 갱신하여 계속 세션을 유지시킬 수 있다.

 

3. 인가/권한 부여(Authorization) 확인

해당 요청을 수행할 수 있는 권한이 있는지 확인 - url 기준으로 할 수 도 있고... 여러가지 방법이 있음

중략

 

4. 로그아웃

로그아웃을 하게 되면 클라이언트가 보낸 토큰을 이용하여 세션을 삭제

aws 기준으로 로그인한 클라이언트의 세션만 삭제(사용자의 전체 세션이 아님)

 

5. 비밀번호 변경 시

변경된 사용자의 전체 세션 삭제

redis의 사용자 세션 sets 에서 token key 를 읽어서 삭제

 

6. 사용자 정보 변경 시

변경된 사용자의 세션을 모두 update 해주고 클라이언트로 이벤트 전송