JWT토큰을 사용하게 된 이유를 간단하게 알아보자
들어가며
JWT(JSON Web Token) 토큰은 현대 웹개발에 많은 부분을 차지하고 있습니다. 이번 포스팅에서는 JSON 토큰이 왜 등장하게 되었는지 간단하게 알아보도록 하겠습니다.
OSI 7 계층
OSI(Open Systems Interconnection) 모델은 데이터 통신의 프로세스를 이해하고 설명하는 데 사용되는 개념적인 모델입니다. 이 모델은 7개의 계층으로 구성되어 있으며, 각 계층은 특정한 역할을 담당합니다.
- 물리계층 : 실제 데이터가 전송되는데 필요한 하드웨어계층(bit 단위로 처리되며 0,1로 이진수 형태로 전송)
- 랜선, 리피터, 허브등과 같은 장비를 가지고 있다.
- 데이터 링크 계층 : 물리적인 데이터를 전송하기 위한 프레임 구조 및 오류 제어 등을 다룬다.(frame 단위로 처리되며 데이터에 필요한 정보를 담고 있다.)
- 스위치(Switch), 브리지(Bridge) 등의 장비를 가지고 있다.
- 네이트워크 계층 : 목적지까지 경로를 찾아주는 역할을 합니다.(packet 단위로 처리되며, 라우팅 프로토콜을 사용해 최적의 경로를 찾아줍니다.)
- 라우터(Router), GateWay 등의 장비를 가지고 있다.
- 전송 계층 : 종단 간 (End -to -End) 통신을 위한 데이터의 논리적인 단위로 신뢰성을 보장하는 계층( segment단위로 처리)
- 세션 계층 : 동기화 작업을 처리한다.
- 표현 계층 : 데이터의 암호화, 캡슐화, 데이터변환등을 담당하는 계층(표현 representation 단위로 처리)
- 응용 계층 : 사용자가 집접 다루는 영역(message 단위로 처리)
-
- Ftp, Web, SMTP 등의 장비를 가지고 있다.
-
예를 들어 A가 네이버에 "JWT"라는 검색어를 입력하면, 데이터 통신 과정은 OSI 7 계층의 순서대로 이루어집니다. 물리적인 전송부터 시작하여 응용 계층까지 진행되며, 데이터는 송신자(클라이언트)에서 네이버 서버로 전달됩니다. 그런 다음, 네이버 서버는 이 요청을 받아들이고 처리하기 위해 각 계층을 거쳐 응용 계층까지 내려갑니다. 데이터 처리가 완료되면, 응답 데이터는 다시 역순으로 송신자(클라이언트)에게 전달됩니다.
(더 자세한 내용은 관련 서적이나 강의를 보시는 것 이 좋을 것 같습니다.. 더 자세하기 설명하기에는 한 포스팅에서도 불가능합니다.. 너무 방대해서...)
데이터 통신 과정에서의 보안과 인증 문제
위에서 "JWT토큰"을 검색 시에 다음과 같은 보안 문제가 발생할 수 있습니다.
- 기밀성 (Confidentiality) : 승인되지 않은 사용자는 정보를 열람할 수 없다. EX) A사용자가 "JWT 검색"을 NAVER에 전송한다면 전 송한데이터는 NAVER만 읽을 수 있어야 한다.
- 무결성 (Integrity) : 승인되지 않은 사용자가 정보를 수정할 수 없어야 한다. EX) A 사용자가 "JWT 검색"을 전송했는데 중간에 "JWT 검색 안 함!"이라고 변경해서 전송하면 무결성이 깨젔다고 볼 수 있다.
- 가용성(Availability) : 승인되지 않은 사용자는 삭제할 수 없어야 한다. EX) A사용자가 "JWT 검색을" 전송했는데 중간에 해커가 데이터를 삭제해 버리면 NAVER서버에는 데이터가 전송되지 않아서 검색한 결과를 볼 수 없게 된다.
요약하자면 기밀성 - 조회, 무결성 - 수정, 가용성 - 삭제에 관련되었다고 볼 수 있다.
기밀성 문제
위에 그림처럼 중간에 해커가 데이터 전달되는 것을 중간에 데이터값을 조회해서 값을 읽을 수가 있다. 이러면 개인정보가 포함되어 있다면 개인정보를 탈취되는 문제가 발생할 수 있다.
무결성 문제
위에 그림처럼 사용자는 "JWT 검색!"을 전송했는데 중간데 해커가 "SESSION 검색!"으로 변경해 네이버 서버로 보내게 된다. 그러면 네이버 서버는 "JWT 검색!"을 전달받는 것이 아닌 중간에 해커가 변경안 "SESSION 검색!"으로 변경해 사용자게에게는 기대했던 JWT 검색이 아닌 SESSION 검색 결고 값을 전달받는 무결성 보안문제가 발생한다.
가용성 문제
위에 그림처럼 중간에 데이터를 가로채 데이터를 삭제해서 네이버 서버에는 아무런 데이터가 전달받지 못해 사용자에게는 아무런 값이 전달되지 않는 가용성 문제가 발생한다.
보안문제 해결방법 세션과 쿠키
(이번에는 검색이 아닌 로그인 시로 예시를 들어서 설명해 보도록 하겠습니다. JWT 토큰은 로그인 시에 많이 사용되는 방식이기 때문입니다.)
앞서 3가지 보안문제에 대해서 간단하게 알아보았습니다.
그러면 어떤 방법으로 해결할 수 있을까요?
.
JWT 토큰이 나오기 전까지는 세션과 쿠키를 통해 보안 문제를 해결하는 것이 일반적이었습니다. 그래서 먼저 쿠키와 세션을 통해 로그인하는 과정을 예시로 들어보도록 하겠습니다.
쿠키 사용 시
위 사진과 같이 네이버 홈페이지에 쿠키를 통해 로그인을 한다고 하면 로그인을 성공하고 나면 키-값 쌍으로 쿠키를 생성해 쿠키저장서에 UserId:User1이라고 저장되게 된다. 요청 시에는 다음처럼 쿠키를 통해서 요청을 보내게 됩니다.
로그인 시와 같은 곳에서 쿠키를 사용하는 것은 매우 좋지 않은 방법이라고 할 수 있습니다. 개발자 모드를 통해서 손쉽게 쿠키값을 가져올 수도 있으며 쿠키는 로컬이나 , 네트워크 전송 시에도 쿠키값 그대로 사용해 전송하기 때문에 세션 하이재킹과 같은 공격등으로 손쉽게 탈취될 수 있는 문제점이 존재합니다.
세션 사용 시
세션을 통해서 로그인을 하게 된다면 로그인 시에 요청한 아이디와 비밀번호를 통해서 일치하는 회원을 DB에서 조회해 일치한다면 User1 데이터 값을 전달해 줍니다. 그 후 서버에서는 UUID값을 생성새 서버에 세션 저장소에 세션아이디와 DB에서 저장된 값을 키-값 쌍으로 저 정합니다. 그 후에 클라이언트에게는 DB에 조회단 User1이 전달되는 것이 아닌 UUID값을 통해 전달하며 그 이후 동작은 쿠키 방식과 동일하게 진행됩니다. 하지만 쿠키에서는 쿠키 값이 탈취당하면 보안 문제가 발생하지만, 세션을 통해 사용한다면 일단 UUID를 통해 전달하기 때문에 탈취를 해도 해독하기가 어렵고 해독을 하더라고 실제 세션아이디에 해당하는 정보는 서버에 있기 때문에 쿠키값이 비해 안전한 방법이라고 볼 수 있다.
세션 로그인 사용 시 문제점
앞서 세션과 쿠키를 통해 어느 정도의 가용성, 기밀성, 무결성등의 보안 문제를 해결했다. 하지만 세션을 사용하는 경우에는 서버에 사용자의 상태 정보가 저장되어 있기 때문에, 같은 세션에 대한 요청은 항상 동일한 서버에 전달되어야 합니다. 하지만 로드 밸런싱을 통해 여러 서버로 트래픽을 분산하는 경우, 클라이언트의 요청이 항상 동일한 서버로 전달되지 않을 수 있습니다. 따라서, 로드 밸런싱 환경에서 세션을 사용하는 경우에는 다음과 같은 문제가 발생할 수 있습니다:
- 세션 일관성 문제 (Session Consistency Problem): 로드 밸런서가 다른 서버로 요청을 전달하는 경우, 사용자의 세션 데이터가 해당 서버에 존재하지 않을 수 있습니다. 따라서, 사용자는 이전에 로그인한 상태임에도 불구하고 새로운 서버로 요청을 보낼 때마다 로그인을 다시 해야 할 수 있습니다.
- 세션 유지 문제 (Session Persistence Problem): 일부 로드 밸런서 구성에서는 특정 사용자의 요청이 항상 동일한 서버로 전달되도록 하는 기능을 제공할 수 있지만, 이를 위해 추가 구성이 필요하고 복잡성이 증가할 수 있습니다
다음과 같이 유저는 Session이 AAAAA라는 값으로 요청을 보냈는데 요청이 로드밸런싱 서버가 Server1이 아닌 Server2으로 처리를 해버렸다 그러면 Server2 쿠키저장소에는 Session:AAAAA라는 값을 가지고 있지 않아 같은 홈페이지인데도 로그인이 되지 않는 오류가 발생할 수 있다.
마무리
이번 포스팅에서는 간단하게 JWT(JSON Web Token) 토큰이 등장하기 전의 사용자 인증과 권한 관리 방법에 대해 알아보았습니다. 기존의 데이터 통신 방식과 세션, 쿠키를 활용한 로그인 방식은 여러 문제점을 안고 있음을 확인할 수 있었습니다. 이러한 문제들을 해결하고자, JWT 토큰이 등장하게 되었습니다. JWT 토큰은 보다 안전하고 효율적인 사용자 인증 및 권한 부여를 위한 방법으로 주목을 받고 있습니다. 다음 포스팅에서는 JWT토큰의 대해서 간단하게 알아보도록 하겠습니다. 글이 많이 부족하고 미흡할 수도 있지만. 미흡한 부분이 있다면 댓글에 남겨주시면 감사하겠습니다..!