인증을 구현하기 위해 기존에 사용하던 Session 로그인이 아닌 JWT를 이용하여 인증을 구현했다. 토큰을 처음 사용했다 보니 알아가는데 너무 오래 걸렸다. 무엇보다 나는 스프링 시큐리티를 사용하지 않고 서블릿 필터나 스프링 인터셉터를 이용해 토큰 유효성 검사를 하려고 했어서 더 쉽지 않았던 것 같다.
이번 프로젝트 인증에서 Session을 사용하지 않은 이유는 서버의 규모가 확장될 때의 인증 문제이기 때문인데 JWT를 이용한 인증도 여러 가지가 있기 때문에 나의 프로젝트에 맞는 단계가 어디인지에 상당히 헷갈렸던 한 주였다.
인증 작업을 하며 문제가 생겼던 부분이나 구현한 부분에 대해 정리를 해보겠다.
Rest API를 설계할 때 인증은 session 기반이 아닌 토큰 기반으로 하는 것이 더 restful 하다고 한다.
문제점
1. JWT Mismatch 예외
jwt signature does not match locally computed signature. jwt validity cannot be asserted and should not be trusted.
=> 이러 예외가 계속 발생했다.
딱 봐도 생성된 토큰과 클라이언트에서 전달된 토큰이 일치하지 않는다는 뜻인 것 같은데 디버거를 돌려 원인을 파악해보았다.
전달된 토큰 값을 가져와 비교하는데 당연히 복호화된 상태로 비교를 해야 일치하는데 토큰 값 문자열이랑 비교하고 앉아있었다.!!
=> 바로 getbytes() 메서드로 해결!
2. JWT 복호화 예외
the verification key's size is 64 bits which is not secure enough for the hs256 algorithm.
=> 이런 예외가 계속 발생했다.
JWT를 생성할 때 서버의 시크릿 키를 이용해 HS256 알고리즘을 사용하는데 이때 이용하는 비트수는 256 bits이다.
내 시크릿 키 비트가 너무 작아서 발생했으므로 막 늘려서 해결!
토큰 유효시간은 1분이므로 로그인 후 1분 동안 인가된 요청이 가능하다.
이런 식으로 헤더에서 서버로 왔다 갔다 하면서 인증 작업을 하는 것이다.
반응형
'📕 Spring Framework > Spring Project' 카테고리의 다른 글
2022.05.18 「Redis DB 적용」 (0) | 2022.05.18 |
---|---|
2022.05.16 「리팩토링」 (0) | 2022.05.16 |
2022.05.12 「ResponseEntity body & BuilderPattern & Join」 (0) | 2022.05.12 |
2022.05.11 「SHA-256 + Salt & 인증」 (0) | 2022.05.11 |
2022.05.10 「Rest Ful Api & DTO,VO mapping & Mysql Index & 상수화」 (0) | 2022.05.10 |