이번 강의에서는
JWT 변경 사항들이 제대로 작동하고 있는지
검증해보도록 하겠습니다
우선
백엔드 웹 애플리케이션으로 시작하겠습니다
그전에 콘솔에서 Spring Security
내부 필터 세부 정보를 확인하기 위해
이전 섹션에서 수행한 모든 디버그 관련 변경 사항을
제거하도록 하겠습니다
이것은 제가 가장 먼저 제거하고 싶은 어노테이션입니다
이후에 application.properties로 가겠습니다
여기서도 저는 로그인과 관련된
이 속성을 제거하고 싶습니다
물론 이들은 JWT 토큰과 관련되지는 않았습니다
하지만 운영 애플리케이션에서 추천되지 않고
나머지 수업시간에 계속해서
갖고 가고 싶지 않기 때문에
제거하려고 합니다
따라서 해당 내용을 삭제합니다
이제 빌드 이후로 웹 애플리케이션을 시작할 수 있습니다
빌드가 완료된 이후
Spring Boot 메인 애플리케이션으로 들어가
여기서 Debug 모드로 시작할 수 있습니다
제 백엔드 애플리케이션은 포트 8080에서 시작되었고
UI 애플리케이션도 실행 중입니다
여기로 확인할 수 있습니다
이제 여기서 애플리케이션으로 로그인합니다
로그인하기 전 개발자 콘솔을 열도록 하겠습니다
개발자 콘솔이 열리고나면
애플리케이션으로 들어가
Cookies 아래에 있는 localhost:4200에 들어갑니다
현재로서는 쿠키가 없습니다
애플리케이션 속으로 로그인하면
CSRF 토큰만 생성되어
쿠키로 저장되는 것을 볼 수 있습니다
JSESSIONID는 그렇지 않습니다
이는 우리가 Spring Security의 해당 기본 동작을
비활성화 했기 때문입니다
이제 다음 단계로는 Network 탭에 들어가
로그인 중에 만들어진
유저 API 요청에 대해
preflight 요청이 아닌
두번째를 클릭합니다
이걸 클릭하면 이 헤더 안에서
밑으로 내리면 Response Headers 아래에
이전에 받았던
Authorization로 된 헤더를 볼 수 있습니다
이는 백엔드 애플리케이션에 의해
생성된 JWT 토큰입니다
해당 JWT 토큰을 가지고
jwt.io 사이트에 가서
같은 토큰을 붙여넣기 해보면
헤더와 내용을 검증할 수 있습니다
여기 헤더에
우리가 사용했던 알고리즘이 뜨는 걸 볼 수 있습니다
비슷하게 내용 안에는
이게 발행자
이게 주체, 이게 ID
그리고 이게 엔드 유저의 권한들입니다
여기서 iat는 issued at이라는 뜻으로
JWT 토큰이 발행되었던 시간입니다
여기에 호버해보면
시간을 볼 수 있습니다
마지막으로 만료 시간이 있습니다
해당 상황의 경우 8시간 정도로 설정되어 있습니다
해당 내용은 여기서도 확인이 됩니다
이로써 JWT 토큰은 성공적으로 생성되었습니다
이제 다음 단계로 웹 애플리케이션 속
남은 API에 접근을 시도할 수 있습니다
여기를 클릭하여 myBalance API로 접근하겠습니다
여기 적절한 응답을 받고 있음을
볼 수 있습니다
이제 이 Headers 정보를 닫고
myBalance API를 봅시다
총 두 줄이 있습니다
하나는 preflight 하나는 일반 요청입니다
따라서 myBalance 중 일반 요청을 클릭한 후
Headers 아래로 스크롤 해보면
Request Headers를 발견할 수 있습니다
Request Headers 안에 보면
Authorization라는 이름으로 된
동일한 JWT 토큰을 보내고 있음을 확인할 수 있습니다
해당 JWT 토큰을 누군가 조작하려 한다면
그들은 유효한 응답을 받지 못할 것입니다
그럼 JWT 토큰을 조작을 시도해 봅시다
JWTTokenValidatorFilter를
열어보겠습니다
여기 첫줄에 중단점을 놓겠습니다
이제 다시 돌아가서
여기 있는 Loans 탭을 클릭하겠습니다
이는 JWTTokenValidatorFilter 내에서의
실행을 멈출 것입니다
이제 해당 JWT 값을
줄 별로 디버깅하여 읽어보도록 하겠습니다
여기 보시다시피 이는 JWT 값입니다
이 JWT 변수로 가서
Set Value라는
옵션을 클릭해 줍니다
이제 해당 토큰 속
한 문자를 무작위로 삭제할 수 있습니다
이로써 토큰을 조작했습니다
이제 어떤 일이 일어날지 살펴보겠습니다
catch 블록 속에 중단점을 두겠습니다
이 중단점을 놓으면
SignatureException이라는 예외를 받았다는 걸 볼 수 있습니다
이는 JWT 서명이 로컬 시스템 혹은 디바이스에서
계산된 서명과 일치하지 않다는 걸 알려줍니다
이렇게 백엔드 서버에서는 누군가 JWT 토큰을
조작하려 했음을 빠르게 캐치합니다
그리고 여기로 들어가보면
대출에 대해 어떠한 정보도 받지 않았음을 확인할 수 있습니다.
왜냐하면 여기 콘솔 안에 보면
Exception 500를 받았음을 알 수 있습니다
이렇게 애플리케이션은 JWT 토큰의 도움으로
완전히 보안처리 되었습니다
그리고 토큰은 더 이상 쿠키 속에 저장되지 않습니다
이는 보안이 강하지 못한 접근이기 때문입니다
더 나아가 JWT 토큰의 도움으로
유저에 대한 정보를 UI 애플리케이션으로 보낼 수 있게 되었습니다
UI 애플리케이션이 어떤 이유에서든지
권한, ID 등의 정보를 필요로 한다면
언제든지 JWT 토큰을 디코딩하여
해당 정보를 활용할 수 있습니다
그리고 백엔드 애플리케이션 속
어디에서 이 JWT 토큰이 저장되어 있지 않습니다
디지털 서명 과정을 통해
토큰을 계속해서 검증하는 것입니다
그리고 이는 매우 퍼포먼스 친화적 접근입니다
이유는 해당 토큰 정보를 데이터베이스에 저장 후
매번 검증하려 하면 무수히 많은 데이터베이스 요청을
생성해야 할 것이고
이는 퍼포먼스에 있어 문제가 되기 때문입니다
하지만 해당 접근으로는 이러한 문제가 없고
모든게 아주 빠르게 진행될 수 있습니다
해당 내용이 명확하게 전달 되었길 바랍니다
그럼 다음 강의 때 뵙겠습니다
감사합니다