JSP

JWT

김마리님 2020. 6. 1. 14:08

서버와 클라이언트가 있다. 서버는 당연히 가용할 수 있는 범위가 있다. 그런데, 서버가 가용할 수 있는 범위를 넘어선다면? 두 가지 방법이 있다.

1. 서버의 크기 늘리기

2. 서버를 분산시키기

 

서버를 늘리는 것이 쉽지 않으므로, 보통 서버를 분산시키는데 이 때 사용하는 하드웨어 장비가 로드밸런싱 장비(L4)이다. 물론 하드웨어를 이용하지 않고 소프트웨어로도 가능하지만 이러면 프로그램이 느려진다. 

L4는 응답과 요청을 물리적으로 기록해서, 만일 요청만 존재하고 응답이 없다면 자연스럽게 아직 클라이언트가 사용중이라고 인식한다. 한 서버가 가용량을 넘어서면 이후에 접속하는 클라이언트를 타 서버로 이동시킨다. 이를 로드밸런싱이라고 하는데, 이렇게 되면 문제가 생긴다. 세션의 문제다. 한 서버가 가지고 있는 세션을 타 서버는 가지고 있지 않기 때문에 클라이언트가 이후 접속하려고 하면 세션이 유지가 되지 않는 단점이 있다. 이럴 때 최초로 만든 세션으로만 이동할 수 있는 기술을 L4가 지원하는데 이것을 스티키 세션이라고 한다.

 

그러나 L4 장비는 고가의 장비이고, L4를 쓸 수 없는 상황이 올 수 있다. 어떤 방법을 쓸 수 있을까?

1. 세션복제

그러나 이 세션복제는 세션이 늘어나거나, 서버가 늘어나면 점점 할 일이 기하급수적으로 늘어나게 된다.

2. DB에 세션을 넣어 select 구문으로 확인, 이 때 물리적 하드웨어로 저장하면 I/O가 자주 일어나기 때문에 메모리에 항상 저장되어 있어야 한다.

그러나 이 방법은 DB의 서버 접근량도 한계가 있고, 메모리에 넣을 수 있는 량도 한정되어있으며, 하드웨어가 예기치못하게 종료되면 DB의 정보가 사라져버린다.

3. 세션만 저장하는 서버 만들기

이런 이유로 세션만 저장하는 메모리서버를 따로 생성하는데, 대표적인 것이 Redis이다. 

Redis도 라우터가격까지는 아니지만 비용이 들기 때문에 최근에는 JWT의 형태로 서버-클라이언트 사이의 과부하를 줄인다.

4. JWT(Json Web Token)

이것을 알기 전에 먼저 RSA에 대해 알아야 한다.

RSA는 공개키 암호 시스템의 약자이다. 이것은 암호키와 복호화키가 다른 타입이다. 암호키를 공개하고 복호키를 비공개한다 생각해보자.

A가 자신이 가진 비밀키(Y)로 암호화하면 누구든 공개키(X)로 풀 수 있을 것이다. 자신의 공개키 X로 암호화한다면 누구든 풀 수 없을 것이다. 그러나 B가 공개한 키 W로 암호화하면 그 암호는 수신자인 B만 풀 수 있다.

 

따라서 암호화는 수신자의 공개키로, 서명은 자신의 비밀키로 잠근다. 서명은 공개되어도 관련 없지만 암호화는 아무나 열어보아서는 안될 정보를 가지고 있기 때문이다.

 

 

최근에는 웹과 서버만의 클라이언트 연결 뿐만 아니라 앱이 클라이언트가 되기도 한다. 서버가 늘어나도 세션에 한계가 일어나고, 이동통신기기의 발달로 서버 사이에 IP변화나 Wifi로 변하는 경우가 많은데, 이럴 경우에 계속 재요청이 일어나며 세션 아이디가 변경된다. 따라서 세션처리에 한계가 생기고 

앱과 웹을 따로따로 만들면 일이 두배로 늘어나기 때문에 웹도 json형태로 받게 된다. 즉, 자바스크립트로 요청하고 json 형태로 응답받는 형태가 늘어나고 있다. 이 jwt의 형태는 변하는 세션에 대응하는 형태로 세션을 필요로 하지 않고 해시(Hash)로 인증받는다.

원리를 보자.

클라이언트(어떤 형태든 상관이 없다)가 서버에 요청을 한다. 이 때 형태를 json으로 파싱하면 다음과 같은 형태를 가지는데, 크게 Header, body, sig 세 가지 형태를 가진다.

header은 내가 사용한 암호화 알고리즘을 기입하고, body는 유저정보(이 때 절대 중요한 개인정보는 넣지 않는다. 절대!) 를 기입한다. 이제 서버는 header의 내용을 해시하고, body의 내용을 해시하고, 내가 가지고 있는 개인키를 해시하여 그 해시값을 sig에 기입한다. 이제 이 세 가지 내용 전부를 해시하여 전자서명을 만들어 클라이언트에게 넘긴다. 재요청할때는 클라이언트는 해시를 다시 서버에게 전달하는데, 서버는 header, body, sig를 모두 해시해서 전자서명을 비교한다. 해시값이 다르게 되면 인증이 되지 않는다. 따라서 클라이언트가 임의로 수정하거나 해커가 임의로 수정하게 되면 해시값의 변화가 생기게 된다.

만일 해커가 이를 가로채서 해킹하게 되더라도 세션의 유지시간이 5분이내로 짧기 때문에 세션의 해킹 시간이 5분여가 된다.

반응형