JWT 란?
우선 JWT 를 만들기 전에 이게 뭔지 부터 알고갈 필요가 있다. 해당 글을 보고 오자
https://latewalk.tistory.com/115
JWT
세션의 단점을 보안하기 위해 나온 Token들은 굉장히 다양하다. 우선 기본적으로 토큰은 서버에 요청을 할 때 헤더에 토큰을 함께 보내도록 하면서 유효성 검사를 도와준다. 이러한 시스템에서는
latewalk.tistory.com
JWT 설정 시작.
그리고 나는 이때까지 시큐리티를 제대로 공부하지 않았다는 티를 너무 많이 냈다. 왜냐하면 로그인을 따로 처리했기 때문이다. 시큐리티의 로그인을 끄고 로그인을 컨트롤러 단까지 받아서 내가 원하는대로 처리해버리고 로그인이 완료되면 JWT 토큰을 발급하는 방향으로 진행을 했던것이다. 지금 생각하면 굉장히 부끄러운 일이다.
어쨌든 그래서 JWT 를 어떻게 설정하는지 부터 보자!
여긴 Service 단에 작성을 한 JWT 의 다양한 내용들이 적혀 있는 곳이다. 너무 크니까 코드를 하나씩 뜯어서 확인을 해보도록 해보자
우선 설정을 하는 곳이다 @Value 를 통해 properties 에 작성해놓은 데이터를 가져올수 있다. 여기엔 나의 개인 JWT 에 관련된 secret 키가 있기때문에 하드코딩하는것이 아닌 나의 properties에 숨겨놓고 사용하는 것이다. 나머지는 내가 만들어줄 accesstoken과 refreshtoken을 설정하는 곳이다. 또한 각자의 만료 기간까지 만들어 정해줄 예정이다.
나는 탈취의 위험을 방지하고 싶어서 RefreshToken을 두기로 했고 RefreshToken에는 정보를 담는것이 아닌 만료시간만 넣어두었다 그렇다면 해당 만료기간을 확인하는 용도로만 사용하게 될것이다. 그리고 RefreshToken은 AccessToken을 새로 발급받기 위한 값으로 남겨둘것이다. 그렇다면 자동적으로 로그인을 유지하게 된다. 이것은 나중에 로직을 통해 상세하게 설명을 해보겠다.
로그인에 성공하면 JWT 를 보내는 로직이다. 해당값을 data 에 accessToken 이라는 이름과 refreshToken이라는 Key 값 즉, 이름을 달고 바디에 담겨서 가게 된다. 그럼 클라이언트는 받아서 해당 이름을 찾아 사용자의 웹에 저장하게 된다.
이거는 클라이언트에서 요청한것에 같이 헤더에 실려오는 AccessToken 혹은 RefreshToken을 확인하는 메소드들이다.
- 클라이언트에서 보내는 토큰은 Bearer 가 붙어있는 채로 토큰이 실려서 오게 될테고 우리는 그 앞의 글씨를 때고 읽어야한다. 그렇게 AccessToken 과 RefreshToken 을 확인한다.
- exctractId 에 관한 이야기 이다. 물론 보다시피 accessToken에 내가 넣어놓은 값은 memberId 단 한개이다. 이것을 확인해보는 작업인데 가장 먼저 토큰이 있는지 확인하고 없다면 Optional,empty() 를 반환한다. 만약 있다면
JWT.require(Algorithm.HMAC512(secretKey) 를 통해 JWT 빌더를 생성하고 검증을 시작한다. verity 가 토큰을 검증하게 된다. 이때 secret 키를 통해 검증을 진행하고 만약 성공했다면 Claim을 가져오게 된다. 그리고 가져온값은 String 으로 반환되어 나오게 된다. 그리고 반환된 객체는 Optional.ofNullable 을 통해 optional 객체로 결정된다.
마지막으로 토큰의 유효성을 검사하는 메소드이다. 해당 메소드는 boolean 타입으로 true or false 만을 나타내게 된다. 물론 들어오는 토큰을 나의 개인키인 secretKey로 확인하고 token을 검증한다. 그리고 만약 아니라면 false 인증이 된다면 true 로 반환되는 메소드이다.
이렇게 JWT 토큰이 들어오면 사용할수있는 부품들을 만들어 주었다. 이제 이것들을 이용해서 JWT 필터를 만들어서 등록해볼것이다.
이분 덕분에 만들수 있었습니다. 정말 감사합니다
'프로젝트 > 팀 프로젝트' 카테고리의 다른 글
babpool 7 . Security에서 로그인 하기 (0) | 2023.07.12 |
---|---|
babpool 5. SecurityFilterChain 설정 (0) | 2023.07.11 |
BabPool 4 . 회원가입 (0) | 2023.07.11 |
BabPool 3. 파일 관리 (0) | 2023.07.11 |
BabPool 2. 사용한 도구들 (0) | 2023.07.11 |