사이드 프로젝트 개발을 하다가 Cookie, Session도 있는데 왜 굳이 JWT를 사용하는지 이걸 사용하면 어떻게 동작을 하는지 궁금해졌다.
여태 회사에서도 혼자서도 개발할 때 다 쓰니까 JWT를 썼던 거 같은데 이제 조금 개발에 대해서 알아야하는게 많아지다 보니 궁금해서 정리를 해보려고한다.
JWT는 디지털로 서명이 되어있어서 검증되고 신뢰를 할 수 있다. JWT는 RSA, ECDSA를 사용하는 HMAC 알고리즘을 사용하고, 공용/ 개인 키 쌍을 사용해서 서명할 수 있다.
JWT는 서로 비밀 유지를 위해서 암호화가 되지만 서명된 Token에 중점을 둔다. 서명된 Token은 그 안에 포함이 된 클레임의 무결성을 검증할 수 있는데,
암호화된 Token은 다른 사람의 클레임은 숨긴다. Token이 공용/개인 키 쌍을 사용해서 서명이 된 경우에 서명은 개인 키를 보유한 당사자만 서명한 것을 증명한다.
위와 같이 JWT를 사용하면 작고 안전하게 정보를 전송할 수 있고, 서명된 Token에 중점을 두어서 비밀 유지를 할 수 있다. 그토큰 자체가 위 기능 수행을 할 수 있다.
사용자가 로그인을 하면 Server가 해당 유저 Token을 유저에게 전달한다. 유저가 요청하면 Token을 포함해서 전달하고, 서버는 해당 Token을 권한이 있는지 또한 유효하고 인증이 되었는지 확인 후 작업을 진행한다.
서버는 유저의 Session을 유지할 필요가 없다. 유저가 보낸 Token만 확인하면 되고, 서버의 자원을 아낄 수 있다.
JWT는 두 개체 사이에서 안정서있게 정보를 교환하기 좋은 방법으로 정보가 sign이 되어 있으면 정보를 보낸사람이 바뀌지 않았는지, 그 정보가 도중에 조작되어있진 않는지 검증을 할 수 있다.
JWT 동작원리는
위 동작 원리와 같이 Token 기반 인증 방식은 사용자의 인증이 완료된 이후 Token을 발급한다. Client쪽에서는 전달받은 Token을 저장해두고 Server에 요청을 할 때 해당 Token을 Server에 함께 전달한다.
그 후 Server는 Token을 검증하고 응답하는 방식으로 작동한다.