이전에 작성한 글의 내용처럼, 회원 서비스를 구현하다가 부딪힌 문제로 인해 JWT를 공부하게 되었다. Postman을 이용하여 로그인 테스트를 시도해 보았지만, 어째서인지 자꾸 에러가 발생했었다. 당시 구체적인 원인을 알아내는데 실패했기 때문에, 구글링 해 본 결과를 바탕으로 JWT에 해답이 있지 않을까 라고 생각되어 일단은 JWT를 공부해보기로 했었다.
그리고 지금 막 대략적인 테스트 프로그램까지 모두 만들어보았는데,
지금 보니 내가 겪은 문제와 JWT는 상관이 없었던 것 같다...
나는 당시 에러가 뜨는 이유에 대해서, SpringSecurity에 미리 구현되어 있다는 로그인 컨트롤러 메서드에 내가 폼 데이터를 잘못된 방식으로 전달한 것이 원인이라고 생각했다.
하지만 이번에 JWT를 이용한 Rest Api 서버를 만들어보고 테스트를 해보았는데, 당시와 똑같이 로그인 컨트롤러 메서드는 따로 구현하지 않았고, key의 변수 명도 똑같이 사용하여 테스트를 성공적으로 마쳤다. 따라서 JWT와 관계없이 그냥 내가 코드를 잘 못 작성하거나 설정이 잘 못 되어 있던 것 같다..ㅋㅋㅋ
따라서 지금 당장 반드시 JWT를 사용할 이유는 사라지게 된 것 같다. 하지만 여기서 자연스럽게 '그렇다면 JWT의 존재 이유는 무엇인가'에 대해 생각해 볼 수 밖에 없었다. 그래서 SpringSecurity만 이용했던 환경과 JWT까지 사용해 본 환경의 차이에 대해서 한 번 생각해 보았다.
- 세션 관리 방식
기존에는 사용자가 로그인 해 있는 동안 세션을 저장하고 유지하는 방식으로 관리되었다. 하지만 JWT토큰을 사용한 방식에서는 굳이 세션을 유지하고 있을 필요 없이, 그때그때 토큰으로 생성해준 일시적인 세션을 통해 인가해주면 되었다. (즉, stateless와 가까운 상태가 된다.) 따라서 서버에 세션으로 인한 과부하가 생길 염려가 거의 사라지는 장점이 있는 것 같다.
그 외에 여러가지가 더 있었던 것 같은데, 막상 1을 써놓고 나니 그 외는 잘 생각이 나지 않는다. API 방식이 아닌 템플릿 엔진을 사용해서 만들어 봤던 때의 기억이 섞여서 그렇게 생각했던 것 같다. 물론 구현적인 측면에서의 차이는 많지만(필터를 직접 구현하는 등), 기능? 성능? 적으로 보았을 때 차이점은 더 이상은 잘 모르겠다. 그런데 갑자기 생각났다.
- csrf공격에 대해 방어할 필요가 사라짐
이전에 작성한 "Rest Api 서버에서의 CSRF방어와 JWT" 글의 내용처럼 JWT토큰에 인증 정보를 담아서 요청하여, 서버에서 요청을 검증할 수 있게 되어 csrf공격이 통하지 않는다는 장점도 있다.
그래서 지금까지 SpringSecurity만으로 구현할 지, JWT까지 써서 구현할 지 한 번 고민해보았는데 (어차피 공부하기도 했고) JWT까지 사용하는 것으로 결정하였다.
+ 일단 현재까지 만든 부분을 다시 한 번 테스트 해보려고 하였으나 마찬가지로 현재로선 불가능한 듯.
템플릿엔진으로 구현했을 때 테스트한 방법
-> login시 즉시 adminPage로 리다이렉트됨
jwt를 이용한 api 서버를 구현했을 때 테스트한 방법
-> login시 직접 만든 헤더의 authentication 키 부분에 인증토큰이 들어옴, 이 토큰을 다시 authentication에 넣어 adminPage 요청
따라서 그냥 JWT까지 마저 구현한 후 테스트해봐야 할 듯