사용자에 대한 인증 방식에는 쿠키 기반 인증방식으로 부터 세션 기반 인증 방식을 거쳐 최근에는 토큰 기반 인증방식을 많이 사용한다. 이 글에서는간단한 Token 기반 인증방식에 대하여 소개할 예정이다. 이글에서 이론적 배경지식을 자세히 다루고 있다.
Spring boot를 이용한 사용자 인증을 저번 글에서 소개했던 AOP 방식을 사용하여 구현할 예정이다.
Gradle 설정
UUID 생성을 위해서는 아래 라이브러리를 추가할 필요가 있다.
implementation("com.fasterxml.uuid:java-uuid-generator:3.3.0")
Token 발급
이 글에서는 UUID를 발급 받아 UUID를 Base64로 인코딩하여 사용하였다.(보안적 측면에서 생각하면 한번더 암호화하거나 JWT를 사용하여 쉽게 구현 할 수 있을 거라 생각 한다.)
val gen = Generators.timeBasedGenerator(EthernetAddress.fromInterface())
var uuid = Base64.getEncoder().encodeToString(gen.generate().toString().toByteArray())
Token 저장
MongoDB의 TTL index를 이용하여 생성된 token은 두시간 이후 자동삭제하게끔 설정, 아래는 연관 Model에 대한 정의이다
@Entity
@QueryEntity
@Document(collection = "token")
class Token {
@Id
var id: String? = null
@Field(name="user_id")
var userId: String =""
@Field(name="token")
var value: String =""
@Field
@Indexed(name="tokenExpirationIndex",expireAfterSeconds=7200)
var createAt: LocalDateTime = LocalDateTime.now()
}
생성한 token model에 발급된 Token를 저장 후 Token를 Response로 client에 전송한다.
var token =Token()
token.userId = user.id.toString()
token.value = uuid
tokenRepository.save(token)
//여기서 DTOtoken은 사용자한테 전송될 전문 class이다
var dtoToken =DTOtocken(uuid)
return ResponseEntity(dtoToken,HttpStatus.OK)
Token 검사
로그인 시 Http header의 token 정보와 MongoDB에 존재하는 정보가 일치 여부를 판단(Spring AOP를 이용하여 controler 함수 호출전 체크하도록 설정.
// Header에서의 token format : Bearer YmVkZGRjNDEtNDc5Ni0xMWVjLThjNGUtYjA3ZDY0ZjFlODIw
val inToken = request.getHeader("Authorization")?.replace("Bearer ","")
var resToken = tokenRepository.findAll(QToken.token.value.eq(inToken))
위에서 MongoDB의 token collection에 대하여 TTL를 설정 하였기 떄문에 만약 찾지못하면 인증 시간 초과라고 판단할 수 있다.
여기까지 간단한 사용자 인증에 관하여 다루어 봤다. 만약 token에 대한 보안에 대해 걱정된다면 JWT 혹은 위 방식대로 발급된 token를 자체적으로 암호화 라이브러리를 사용하여 암호화하여 사용할 수 있다.
'Spring boot' 카테고리의 다른 글
[Spring] Logging 구성 및 구현 (0) | 2021.11.22 |
---|---|
[Spring] Async 대해 (0) | 2021.11.22 |
[Spring] Spring AOP 개념 및 구현 (0) | 2021.11.15 |
[Spring] Kotlin + Spring boot 에 MongoDB을 도입(Spring Data MongoDB, Querydsl) (0) | 2021.11.14 |
[Spring boot] DI 설정에 관하여 (0) | 2021.11.12 |
Comment