JWT 강의들 대충 따라하면 님들 코딩인생 끝남 강의를 보고 정리했다.
회원기능을 구현해서 로그인 한 사람만 해당 사이트를 보여줄 수 있게 하려고 한다.
여기서 session과 token 두 가지 방법 중 하나를 이용해서 구현이 가능하다.
둘다 회원인증의 기본적인 동작 방식은 유사하다.
user가 로그인을 하면 서버가 user한테 입장권 하나 발급해준다.
사이트에서 어떤 서비스를 제공할 때 입장권이 필요하다고 요청을 하면
user가 입장권을 제출하고 문제가 없으면 해당 서비스를 제공하게 된다.
session과 token은 입장권에 써있는 정보가 다르다.
session
입장권에 써있는 정보가 별로 없다.
ex) 발급번호 하나 정도만 적혀있다.
user가 입장권을 제시하면 서버가 메모리나 db에 따로 만들어둔 입장권 발급 목록에서
입장권의 발급번호를 조회한 다음에 문제가 없으면 user를 통과시켜준다.
jwt
입장권에 써있는 정보가 많다.
ex) 회원명, 이메일, 발급일, 유효기간 등등이 적혀있다.
서버는 입장권을 검사를 할 때 입장권 자체 하나만을 보고 유효기간이나 다른 문제가 없다면 user를 통과시켜준다.
장점
stateless하다.
회원이 많아질 수록 서버에 부담이 덜해진다.
기존의 session방식은 회원이 입장권을 제시할 때마다 db를 조회해봐야하므로 동시에 접속하는 회원이 많아지면 힘들어진다.
하지만 jwt방식은 user가 입장권을 제시하면 입장권 자체만 확인하면 되므로 처리가 매우 빨라진다.
이러한 장점이 있어서 jwt로 회원기능을 구현하는 것이다.
주의할 점
jwt를 쓰는 곳이 많다보니 이곳저곳에 있는 것들을 보고 그대로 막 쓰면 보안 이슈가 생긴다.
jwt는 아래와 같이 생겼다.
1. HEADER의 alg : none
공격
none으로 사용했을 때 간혹 어떤 서버들은 입장이 가능하다.
→ HS256으로 사용한다.
2. JWT는 변환이 쉽다.
decoding이 매우 쉽다.
따라서 민감한 user 정보를 그대로 넣으면 안되고 최소한의 정보만 담는 것이 좋다.
3. secret key 문제
대충 적으면 안된다.
짧은 간단한 문자열로 적으면(ex. secret, secret key) 때려 맞추기 쉬워서 서버가 뚫린다.
따라서 key를 매우 길게 설정하고 공유를 하지 않는다.
또는 생성용 키와 검증용 키 2개를 사용한다. (private key + public key)
4. jwt 탈취
어떤 user의 jwt 입장권을 탈취하는 경우
이 부분은 헬스장 입장권 잃어버리면 잃어버린 사람 책임이므로 굳이 깊게 생각할 필요는 없다.
카드 회사의 경우 카드 잃어버리면 사용정지 시키듯이 입장권 사용을 정지 시키는 조치를 취할 수도 있다.
하지만 jwt 방식은 구조상 입장권을 회수하거나 정지시키기 어렵다. (stateless jwt는 원래 못한다.)
solution
1. 훔치기 어렵게 만들어 둔 저장소를 사용한다. ( HttpOnly cookie )
2. 입장권 black list를 만든다.
특정 입장권은 입장이 불가능한 목록을 만든다.
그래서 누가 입장권을 제시할 때 마다 검사를 한다.
그런데 이런 식으로 코드를 작성하게 되면 jwt를 쓰는 장점이 없어진다.
(session 방식이랑 별 차이가 없다.)
3. jwt 유효기간 짧게 설정
이 경우 입장권 재 발급을 위한 refresh token을 따로 운영을 해야한다.
그리고 refresh token이 있으면 유효기간이 끝날 때 마다 새로 jwt를 발급받을 수 있다.
refresh token이 탈취당하는 경우도 있기 때문에 Refresh token rotation이라는 방법을 쓰는게 안전하다. (refresh token은 언제나 1회용)
결론
대부분의 서비스들은 session 방식으로 회원 인증을 구현 하는 것이 맞다.(간단함)
회원이 1억명이거나 회원 입장권 조회하는 것이 매우 힘이 들거나
마이크로 서비스 같은 것들이 많다면 jwt를 쓰는 게 나을 수도 있다.
보안이 중요한 서비스를 만들 때 jwt를 대충 갖다 쓰는 곳은 없다.
다른 업체의 인증 서비스를 이용할 수도 있다.
따라서 jwt를 쓰던 session을 쓰던 다른 기능을 도입할 때는 장단점을 파악해서 도입을 해야한다.