세션과 토큰

Feb 20, 2024
세션과 토큰
 

1. 세션 인증 방식

 
notion image
 
클라이언트가 서버에 요청을 하면 서버는 세션키를 클라이언트에게 전해주고 세션에 클라이언트의 상태를 저장한다.
 
세션 방식은 stateful 방식으로 미리 세션 공간을 확보해놓기 때문에 확보한 공간 이상 요청이 들어오면 클라이언트는 대기가 일어난다. 그래서 이를 해결하기 위해 서버의 수를 늘려야 한다.
 
notion image
 
서버를 늘리면 하나의 진입점을 만든다. L4 장치를 통해 분산된 서버 중 여유가 있는 서버로 연결된다. 하지만 서버를 늘리면 문제가 발생한다.
 
💡
1번 서버에 접속해서 세션이 1번 서버에 저장됐는데, 다음 요청 시 2번 서버와 연결되면 세션이 1번 서버에 있기 때문에 인증이 실패하게 된다.
 
그래서 이를 해결하는 몇 가지 방식이 있다.
 
  • 스티키 세션(Sticky Session) : 클라이언트가 처음 요청한 서버로만 연결되는 방식. 서버 부하나 장애가 발생하면 요청을 처리할 수 없음.
  • 세션을 모든 서버에 복사 : 1번 서버와 연결되어 저장된 세션을 다른 서버에도 복사한다. 클라이언트가 요청을 여러번 반복될 때 찰나의 순간에 세션 인증이 되지 않을 수 있음.
  • 세션에 저장하지 않고 DB에 저장 : 서버에서 DB에 요청을 해서 정보를 확인. I/O 가 자주 일어남.
  • 메모리DB 사용 : 하드디스크를 사용하지 않고 메모리에 세션을 저장. Redis, memcache 등. I/O가 없어 빠름. OAuth 를 못함.
 
 

2. 토큰 인증 방식

 
토큰 인증 방식은 서버가 클라이언트에게 토큰을 제공하여 인증하는 방식이다. 클라이언트가 서버에 로그인 성공을 하면 서버는 클라이언트에게 토큰을 제공하고, 클라이언트는 인증이 필요할 때 마다 토큰을 서버에 전달해 인증을 한다.
 
토큰 인증방식에는 크게 두 가지 방식이 있다.
 

2.1. 대칭키 방식

 
notion image
 
1개의 키를 사용하는 방식.
클라이언트가 서버에 로그인 요청을 한다. 로그인이 완료가 되면 서버는 클라이언트의 상태를 암호화한 토큰을 클라이언트에게 제공한다. 그리고 이후 클라이언트가 토큰으로 인증을 시도 했을 때 서버가 가지고 있는 키로 인증을 할 수 있다.
 
💡
서버는 클라이언트의 상태를 저장하지 않고 키만 저장하면 되기 때문에 stateless 상태가 된다.
 
notion image
 
 
대칭키 방식은 서버 확장에 유리하다. 단일 진입점으로 프록시 서버를 만들어 프록시 서버에서 토큰 인증을 하면 된다.
 
💡
세션 방식은 단일 진입점을 만들어 세션을 보관하면, 서버에서 인증이 필요할 때 서버에 세션이 없어 인증이 불가능하다. 토큰 방식은 토큰에 클라이언트의 상태를 포함하기 때문에 단일 진입점을 활용해서 인증을 해도 서버에서 클라이언트의 상태를 확인할 수 있다.
 
대칭키 방식의 단점은 다음과 같다.
 
  • 열쇠가 하나이기 때문에 다른 서버에 열쇠를 전달 시 해킹의 위험이 있음
  • 토큰의 검증을 토큰을 발행한 서버만 가능하기 때문에 클라이언트나 중개인이 토큰의 신뢰성을 알 수 없음
 

종류

  • DES (Data Encryption Standard)
  • AES (Advanced Encryption Standard)
  • 3DES (Triple DES)
  • Blowfish
  • Twofish
  • ARIA (Academy Research Institute Agency)
  • IDEA (International Data Encryption Algorithm)
  • RC5
 

2.2 비대칭키 방식

 
비대칭키 방식은 공개키, 비밀키 두 개의 키를 사용하는 방식이다.
공개키는 공개되어 있는 키로 누구나 알 수 있으며, 비밀키는 본인만 알 수 있다.
 
notion image
 
 
비대칭키의 방식은 다음과 같다. C.비밀키로 암호화를 하면 C.공개키로만 열 수 있다. S.공개키로 암호화를 하면 S.비밀키로만 열 수 있다. C.공개키를 C.공개키로 열거나, S의 키를 C의 키로 열 수 없다.
 
그림에서 처럼 클라이언트가 서버에 로그인 성공을 하면 서버는 클라이언트에게 토큰을 전달하는데, 이때 토큰은 C.공개키로 암호화 되어 있다. 따라서 C.공개키로 암호화된 토큰은 C.비밀키를 가진 클라이언트만 확인 할 수 있다.
 
notion image
 
 
그림에서 처럼 가짜 사이트가 통신을 가로채 가짜 토큰을 전송했다고 가정해보자.
 
그렇게 된다면 C.공개키는 누구나 알 수 있기 때문에 클라이언트는 이 데이터가 진짜 데이터인지 아닌지 확인할 수가 없기 때문에 무결성이 깨진다.
 
그래서 이것을 막기 위해 토큰을 한 번 더 암호화 한다.
 
notion image
 
C.공개키로 암호화한 토큰을 S.비밀키로 한 번 더 암호화한다. S.비밀키는 서버만 알 수 있기 때문에 S.공개키로 인증이 된다면 데이터의 신뢰성을 가질 수 있다.
 
💡
비대칭키 방식의 장점 1. 키를 교환하지 않아도 된다. 2. 신뢰성을 가질 수 있기 때문에 전자서명으로 사용할 수 있다. 3. 토큰의 신뢰성 검증을 토큰을 발행한 서버가 아니라 클라이언트나 중개인이 할 수 있다.
 

종류

  • RSA (Rivest-Shamir-Adleman)
  • DSA (Digital Signature Algorithm)
  • ECC (Elliptic Curve Cryptography)
  • Diffie-Hellman 키 교환
  • ElGamal
 

3. 정보 보안의 3요소

 
비대칭키 방식을 활용하면 정보 보안의 3요소를 지킬 수 있다.
 
  • 기밀성(Confidentiality)
    • 데이터가 인가되지 않은 사람에게 새어나가지 않는 것이다.
    • 기밀성을 해치기 위한 공격: 스누핑(Snooping)과 트래픽 분석(Traffic Analysis) 등
  • 무결성(Integrity)
    • 데이터가 변조되지 않는 것
    • 무결성을 해치기 위한 공격: 변경(Modification), 가장(Masquerading), 재연(Replaying), 부인(Repudiation) 등
  • 가용성(Availability)
    • 기밀성과 무결성을 보장하면서 허용된 사람들이 데이터를 이용 할 수 있도록 하는 것
    • 가용성을 해치기 위한 공격: 서비스 거부(Denial of Service), EMP공격, 물리적 파괴 등
    •  
Share article

{CODE-RYU};