JWT에 대해서 설명해주세요
면접 답변
JWT(JSON Web Token)는 클라이언트와 서버 간의 인증 및 정보 교환을 위한 토큰 기반 인증 방식입니다.
JWT는 헤더, 페이로드, 서명으로 구성되며, 페이로드에는 사용자 정보와 만료 시간 등의 데이터가 포함됩니다. JWT는 서버와 클라이언트 간의 상태를 유지하지 않고도 인증을 처리할 수 있다는 장점이 있습니다.
JWT를 사용할 때 주의점으로는 보안이 있습니다. 토큰의 저장 위치와 검증 로직이 중요하며, 구현을 잘못할 시, 보안 취약점을 초래할 수 있습니다.
개념
JWT 구성
Header
어떠한 알고리즘으로 암호화 할 것인지, 어떠한 토큰을 사용할 것 인지에 대한 정보가 들어있음
Payload
전달하려는 정보(사용자 id나 다른 데이터들, 이것들을 클레임이라고 부른다)가 들어있음
payload에 있는 내용은 수정이 가능하여 더 많은 정보를 추가할 수 있음
노출과 수정이 가능한 지점 → 인증이 필요한 최소한의 정보(아이디, 비밀번호 등 개인정보가 아닌 이 토큰을 가졌을 때 권한의 범위나 토큰의 발급일과 만료일자 등)만을 담아야함
Signature
가장 중요한 부분: 헤더와 정보를 합친 후 발급해준 서버가 지정한 secret key로 암호화 시켜 토큰을 변조하기 어렵게 만들어줌
서버는 토큰이 조작되었는지 아닌지를 쉽게 알 수 있음
조작된 토큰을 악용하기가 어려워짐
동작 원리
사용자가 id와 password를 입력하여 로그인 요청을 한다.
서버는 회원DB에 들어가 있는 사용자인지 확인을 한다.
확인이 되면 서버는 로그인 요청 확인 후, secret key를 통해 토큰을 발급한다.
이것을 클라이언트에 전달한다.
서비스 요청과 권한을 확인하기 위해서 헤더에 데이터(JWT) 요청을 한다.
데이터를 확인하고 JWT에서 사용자 정보를 확인한다.
클라이언트 요청에 대한 응답과 요청한 데이터를 전달해준다.
토큰 방식의 한계
signature를 통해 위조 토큰을 분별할 수 있지만, 토큰 자체가 탈취됐을 경우 한계가 분명해짐
무상태성: 인증 상태를 관리하는 게 서버가 아니기 때문에 토큰을 강제로 만료시킬 수 없음
만료될 때까지 사용자인 척 계속 요청을 보낼 수 있음
유효기간: 토큰 만료 기간을 길게 설정하면 탈취 될 위험성이 증가하고, 짧게 설정하면 사용자 경험에 안 좋은 영향을 미침
→ 보완하기 위한 방식: accessToken, refreshToken
JWT 유형
액세스 토큰
주로 사용자 인증을 위해 사용되며, 만료 시간이 짧음
노출되어도 상대적으로 영향이 적으나 짧은 만료 시간으로 보호
서버가 클라이언트의 권한을 확인하는 데 사용
리프레시 토큰
Access Token의 만료 시점을 연장하거나 새로 발급하는 데 사용
만료 시간이 길고, 클라이언트가 안전한 저장소에 저장
서버에서 관리할 수 있으며, 보안이 중요한 토큰
저장 위치
로컬 스토리지
브라우저가 새로고침되더라도 정보들이 유지되기 때문에 사용자 편의성이 높은 편
= 브라우저를 닫고 다시 열어도 정보들이 유지됨
JS 코드를 통해 접근이 가능하기 때문에 XSS 공격에는 취약하고 CSRF 공격에는 안전함
세션 스토리지
현재 떠 있는 텝에서만 유지됨 → 로컬 스토리지에 비해 제한적
새로 고침할 때는 사라지지 않지만, 탭을 닫고 다시 열 때는 데이터가 사라짐
쿠키
클라이언트의 JavaScript에서 접근할 수 없어 보안성 높음
CSRF 공격에 취약할 수 있으나 CSRF 방어 메커니즘 적용 가능
비공개 변수
브라우저가 새로고침될 때마다 유지가 되지 않기 때문에 사용자는 새로고침 할 때마다 재접속을 해야하는 불편함을 감수해야함
잘사용하지 않는 방법
JWT를 탈취하기 위해서 사용할 수 있는 방법
XSS 공격
웹사이트에서 의도치 않은 스크립트를 넣어서 실행시키는 기법
웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 발생하며, 결과로 사용자는 의도치 않은 동작을 수행하거나 쿠키, 세션 등의 정보를 탈취 당하게됨
CSRF 공격
사용자가 자신의 의지와는 무관하게 침입자가 의도한 행위를 서버에 요청하게 만드는 공격
특정 사이트가 사용자를 신뢰하기 때문에 발생하는 문제
꼬리 질문
JWT에서 사용할 수 있는 서명 알고리즘에는 어떤 것이 있나요?
JWT에서 무상태성을 극복할 수 있는 방법은? = JWT를 사용하면서 토큰이 서버에서 강제 만료되도록 하는 방법은?
Last updated