티스토리 뷰
요즘 웹사이트 개발에 대한 이야기들을 들어보면 사용자 인증 및 인가에 대해서 JWT를 쓰지 않으면 안되는 것처럼 분위기가 흘러가고 있습니다. 개인적으로 너무 많은 방법이 중구난방으로 쓰이는 것도 싫어하지만, 환경을 고려하지 않고 무지성으로 특정 기술만을 "절대선"인양 쓰는 것도 역시나 싫어합니다. 그리고, 제가 최근에 좋아하지 않는 경향 중 하나가 JWT를 무지성으로 남발하는 것입니다.
JWT에 대해서 웹개발자들은 거의 다 알고 계시겠지만, Json 기반의 값입니다. 특징에 대해서는 jwo.io에서 자세히 설명하고 있으니 넘어가기로 하고, JWT를 많이 사용하게 된 계기는 REST 때문이라고 생각합니다. REST가 유행이 되면서 stateless하게 요청을 하는 것이 유행하게 되었고, 기존의 세션(Session) 방식을 벗어나 사용자가 보관중인 어떠한 값을 통해 요청을 보낸 사용자가 누구인지와 요청을 보낸 사용자가 어떠한 정보를 가지고 있는지(권한을 가지고 있는지 등)를 서버가 알 수 있게 하는데 그 목적이 있습니다.
서버(여기서는 백엔드와 같은 의미로 쓰겠습니다)에서는 사용자에 대한 정보를 굳이 가지고 있지 않고 JWT에 포함되어 있는 변조방지 기능을 이용해서 토큰이 내가 처리해도 되는 것인지 확인하고 거기에 들어있는 내용만 가지고도 그 사용자에 대한 정보를 가져올 수 있기 때문에 사용자의 정보를 다시 내부에서 찾아서 가져와야 하는 부담을 줄일 수 있고, 서버가 여러 대일 경우 사용자에 대한 정보를 각 서버가 공유하고 있거나 데이터베이스에서 요청 때마다 가져와야 하는 부담이 없기 때문에 MSA 같은 환경에서 특히 유리하다는 논리입니다.
정말 이러한 장점만 있을까요? 기존의 Session보다 무조건 유리할까요? 그건 아니라고 생각합니다.
제가 생각하는 JWT 기반으로 토큰을 이용해 인증하는 시스템에는 다음과 같은 문제가 있다고 생각합니다.
- 표준화 된 구현체가 없다
- Base64로 인코딩된 긴 문자열을 API 요청 때마다 보내줘야 한다
먼저 표준화된 구현체가 대부분의 언어나 프레임워크에 없습니다. 국내에서 가장 많이 쓰는 Java/Spring 환경에서 JWT 관련해서 검색하면 거의 10개 가까이 되는 파일을 통해 Spring Security 기반으로 사용하는 예제가 많은데, 사용자마다 제각각의 구현방식을 쓰고 있고 내용도 초보자들이 보기에는 굉장히 난해합니다. J2EE 기반의 MicroProfile이나 Quarkus 같은 프레임워크에서는 microprofile-jwt-auth-api, smallrye-jwt 라이브러리를 통해 표준화된 구현을 제시하고 있으나 채용률이 처참합니다. 다른 언어나 프래임워크도 별반 차이가 없습니다. 그래서 JWT를 이용한 로그인을 구현하는데 의외로 많은 공수가 들고 난이도가 상승하게 됩니다.
또한 기존의 세션 방식에선 사용자가 session id 라는 쿠키값만 요청 때마다 보내면 서버에서 이 값을 이용해 서버 내에 저장된 세션 정보를 가져올 수 있습니다. 사용자는 쿠키만 지우지 않는다면 세션은 유지되고, 서버 역시 별다른 구현 없이 현재 사용자의 세션만 조회해서 비어 있지 않다면 내용을 꺼내서 바로 사용할 수 있습니다. 이 때 사용되는 session id는 JWT보다 훨씬 크기가 적기 때문에 사용자에게 부담이 덜합니다. PC라면 크기에 덜 민감할 수 있지만, 모바일이라면 이야기가 다릅니다. 서버끼리의 통신에서 사용되는 네트워크 비용은 실제 운영비에 덜 영향을 미치는(혹은 아예 영향은 안미치는) 경우가 대부분인 반면, 사용자와 서버 사이의 통신에서의 비용은 사용자 역시 모두 무제한 요금제를 쓰지 않는 이상 무시할 수 없고, 서버 측 역시 외부로 보내는 통신 용량에 따라 과금되는 경우가 대부분이라 무시할 수 없습니다. 설령 세션 방식을 사용할 때 세션 클러스터링을 쓰기 위해 Redis와 같은 No SQL을 이용하거나, RDBMS을 이용하더라도 서버 네트워크 내에서의 통신이기에 통신 비용이 거의 발생하지 않고 서버 자원에 대한 비용만 발생할 뿐더러, 사용자에게 비용을 전가하는게 적다는 장점이 있습니다.
그래서 저는 무조건적인 JWT 이용은 지양하고, 세션을 이용한 인증도 고려를 해보라고 권하고 싶습니다. 무엇보다 사용에 대한 방법이 각 언어마다 표준적으로 제공되고 있고, 사용하기가 무척 편리합니다.
마지막으로...
반박 시...여러분 말이 맞습니다.
'Programming > 프로그래밍 잡설' 카테고리의 다른 글
백엔드는 Query 날리고(실행하고) 결과만 던져주는 것만 알면 된다? (0) | 2023.12.19 |
---|---|
프로그래머 초봉 6000에 대한 단상 (0) | 2023.12.19 |
Java는 악의 축, 쓰레기인가? - 2. 높은 메모리 사용량, 실행파일 용량, 컨테이너 비친화적, 신기술 적용이 느림 점 (0) | 2023.12.04 |
Java는 악의 축, 쓰레기인가? - 1. 전자정부 프래임워크 (0) | 2023.11.29 |
JPA(ORM)는 "절대선(善)"인가? (4) | 2023.11.28 |
- Total
- Today
- Yesterday
- 페이징
- manjaro
- Spring
- Phabricator
- docker
- proxmox
- NoSQL
- messages.properties
- OracleJDK
- KDE
- Spring Boot
- jooq
- boot
- 도입기
- couchbase
- git
- 프로젝트 규모
- RestTemplate
- Nas
- 시니어 프로그래머
- 엘지
- 외장 WAS
- Redmine
- paging
- 클라우드플레어
- 워드프레스
- java config
- 내장 WAS
- Spring MVC
- SI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |