TOKEN으로 하는 인증의 의미를 먼저, 좀 더 자세히 알아보자 .
COOKIE의 탈취가, 개인정보의 탈취를 의미하진 않는다. (COOKIE 만으로 사용자임을 인증할 수 없다)
하지만, 서버에 COOKIE를 저장하고 생성하는 등 번거롭고 공간이 추가로 필요하다.
TOKEN으로 인증하는 방법 :
USER가 별도의 서버1에서 TOKEN을 생성받고, 해당 USER는 서버 2에 개인정보와 TOKEN을 같이 전송한다.
COOKIE 저럼 동일한 서버가 아니기 때문에, TOKEN에는 개인 정보가 어느정도 들어있다. (USERNAME등)
토큰은, 저장소가 별도로 필요없는 장점이 있지만, 세션을 저장하지 않아 회수가 어렵다.
(COOKIE보다 안전한 방식이라고 정의할 순 없다)
JWT란, 토큰 방식중 가장 잘 알려진 방식이다. (JSON을 활용한다)
HEADER -> JSON으로 변환해서 UTF-8으로 인코딩한다. (암호화 된 값이 아님에 주의하자 )
PAYLOAD-> 실제 인증에 필요한 데이터들을 저장
SIGNATURE(서명) -> PAYLOAD,HEADER를 SECRETKEY로 HASING하고 BASE64로 변경.
KEYROLLING방식을 사용한다. : 다양한 SECRET KEY를 사용하고, 수시로 삭제 ,추가 , 변경한다.
이 방식으로 KEY로 인한 위험성을 줄인다.
JWT의 실제 구현
implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.2'
해당 의존성을 추가 .
JWT KEY
KEYSET을 가지고 있다. KEY는 설정된것.
해당 KEY중 하나를 가져올 수 있는 METHOD를 구현.
이 많은 KEY들중 한개를 골라서 ,
JWT 객체 안에 ( 정보, 토큰 발행시간 , 발행시간 , KEY ID, 서명값)을 발행하여 TOKEN을 생성한다.
jwttoken에서 username을 찾고, 해당 payload의 subject를 가져오는 코드를 작성하였다.
현재 key를 생성하고, jwt token을 생성하는 등의 구현만을 진행했다.
해당 jwt token을 받아들일, filter가 필요하다.
인증이 정상적으로 진행된다면, 성공적인 인증시 cookie를 응답에 추가로 넣어준다.
cookie에서 , token을 가져오고 만약에 없다면 NULL을 반환.
또한 SECURITYCONTEXT에, 해당 인증 COOKIE를 추가해준다.
JWT 토큰을 발행하면, 해당 TOKEN으로 사용한다.
이제 이 두 filter를 configuration에 등록해줘야하는데,
또 spring security 6의 문제 때문에 authenticationmanager를 바로 넣을 수 없다.
**허나, 해당문제의 해결방안을 찾지 못하였다. 아시는 분이 있으면 댓글 주시면 정말 감사하겠습니다.