본문 바로가기
스프링

JWT Token Service 개발 중 고민, Tip

by 순원이 2024. 1. 24.

 

🖤 Key 값 생성 사이트

https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

사용자 경험을 고려하여 엑세스 토큰 기간을 설정하는 것이 좋다.

일단 1시간으로 설정

환경변수 설정하는 법

출처: https://mchch.tistory.com/282


🖤 jwt gradle 설정(spring3)

    implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
    runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
    runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'

🖤 굳이 access Key랑 refresh Key를 나눠야 하나 같은 키를 쓰는 거 아닌가

💡 굳이 access Key랑 refresh Key를 나눠야 하나 같

은 키를 쓰는 거 아닌가

아니다, access, refresh token secret 값이 다르기 때문이다

많은 사람들은 시크릿 값을 하나로 했다 즉, access, refresh token key 값을 통일했다 그래도 되나?

키 값을 다르게 하면 보안상 더 좋긴 하지만. 키 값이 해킹당할 확률은 몇 천억분의 일이다. 키 값을 따로 두면 Controller 상에서 키 값이 노출 될 수 있어 (내가 코드를 잘못 짠 걸 수도 있다) 키 값을 통일한다.

💭 키 값 노출 문제 고민

 

 

isTokenvalid메소드를 작성하다 흠침했다. to ken을 parse를 하기 위해서는 시크릿 키 값이 필요하다. 그럴려면 refresh랑 access랑 구별하기 위해 파라미터로 받아야 한다. controller 상에서 키값을 service 단으로 넘겨주는 건 안 좋은 것 같다.

시크릿 키 값 자체가 뺏길 가능성이 낮기 때문에 코드의 복잡성을 해결하기 위해 refresh와 access 시크릿 키 값을 통일해야겠다.


🖤 refreshToken으로 재발급할 때 기존의 남아있던 accesToken과 refreshToken을 어떻게 없애지?

⇒ redis or 관계형 database로 관리

🖤 Redis or  관계형 DataBase?

속도: Redis는 메모리 내 데이터 저장소이므로 읽기 및 쓰기 작업이 매우 빠르다.
내장 만료: Redis에는 키에 TTL을 설정하는 메커니즘이 내장되 있어 토큰 또는 세션으로 자동으로 만료하는데 유용하다.

위 이유로 Redis를 선택했다.

 


🖤 그렇다면 JWTService에서 시크릿 키 값을 생성을 분리할 수 있다. 그렇다 하더라도 키 책임이랑 토큰책임이랑 분리해야 하는 거아닌가?

 키, 토큰 분리 단점:

  • 한 눈에 안 들어온다
  • 튜머치다. 과도한 객체지향인듯 싶다

키, 토큰 분리 장점:

  • 책임을 분리할 수 있다.

=> 

분리를 안 하는 것이 유지보수에 좋을 것 같아 분리하지 않겠다 


🖤 @Value

💡 yml을 인식하는 어노테이션

import org.springframework.beans.factory.annotation.Value;

요거 임포트 해줘야 함 👿 Lombok 임포트 하는 거아님

 


🖤 access, refreshToken을 클라이언트에게 보낼 때 어떤 형식으로 보내야 하나?

헤더에 담아야 하나 바디에 담아야 하나

→ 헤더랑 바디의 보안 수준 부터 파악해야겠다

⇒ 보안적인 측면에서는 차이점이 없다