[kotlin] 코틀린 웹 서버에서 인증 토큰 활용 방법

코틀린은 안전하고 간결한 문법으로 개발자들에게 인기있는 언어입니다. 코틀린을 사용하여 웹 서버를 개발할 때 인증 토큰을 활용하는 방법에 대해 알아보겠습니다.

1. 인증 토큰이란?

인증 토큰은 클라이언트가 서버에 요청을 보낼 때 신원을 확인하기 위한 수단입니다. 이 토큰은 클라이언트가 로그인한 후에 발급되며, 요청이 들어올 때마다 헤더에 포함하여 전송됩니다. 서버는 이 토큰을 확인하여 클라이언트의 신원을 인증합니다.

2. JWT(Json Web Token) 사용하기

JWT는 인증에 사용되는 표준화된 인증 토큰 형식입니다. 코틀린 웹 서버에서 JWT를 사용하여 인증을 구현할 수 있습니다.

JWT 토큰은 세 부분으로 구성됩니다: 헤더, 페이로드, 서명입니다.

먼저, io.jsonwebtoken 패키지를 Gradle 또는 Maven에 추가해줍니다. 이 패키지를 사용하여 JWT를 생성, 확인 및 파싱할 수 있습니다.

Maven:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

Gradle:

implementation 'io.jsonwebtoken:jjwt:0.9.1'

다음으로, JWT를 생성하고 확인하는 예제 코드를 작성해보겠습니다.

import io.jsonwebtoken.Jwts
import io.jsonwebtoken.SignatureAlgorithm

fun createJwtToken(userId: String): String {
    val token = Jwts.builder()
        .setSubject(userId)
        .signWith(SignatureAlgorithm.HS256, "secretKey")
        .compact()

    return token
}

fun verifyJwtToken(token: String): Boolean {
    try {
        Jwts.parser().setSigningKey("secretKey").parseClaimsJws(token)
        return true
    } catch (e: Exception) {
        return false
    }
}

createJwtToken 함수는 주어진 사용자 식별자(userId)로 JWT 토큰을 생성합니다. verifyJwtToken 함수는 토큰이 유효한지 확인합니다.

3. 코틀린 웹 서버에서 JWT 활용하기

코틀린 웹 서버에서 JWT를 활용하려면 다음 단계를 따르십시오:

  1. 클라이언트가 로그인 성공한 후 JWT 토큰을 생성하여 반환합니다.
  2. 클라이언트는 이 토큰을 미래의 요청에 대한 인증 수단으로 사용합니다.
  3. 서버는 클라이언트가 보낸 요청의 헤더에서 토큰을 추출하고, 해당 토큰이 유효한지 검증합니다.
  4. 유효한 경우, 클라이언트의 요청을 처리하고 응답을 반환합니다.

코틀린 웹 프레임워크인 Ktor를 사용하여 예제 코드를 작성해보겠습니다.

import io.ktor.application.Application
import io.ktor.application.call
import io.ktor.auth.Authentication
import io.ktor.auth.jwt.jwt
import io.ktor.http.HttpStatusCode
import io.ktor.request.receive
import io.ktor.response.respond
import io.ktor.routing.post
import io.ktor.routing.routing

fun Application.module() {
    // JWT 설정
    val jwtSecret = "secretKey"
    val jwtIssuer = "example.com"
    val jwtAudience = "client"
    
    authentication {
        jwt {
            realm = jwtIssuer
            verifier(JwtConfig.makeVerifier(jwtSecret))
            validate { credentials ->
                if (credentials.payload.audience.contains(jwtAudience))
                    JWTPrincipal(credentials.payload)
                else
                    null
            }
        }
    }

    routing {
        post("/login") {
            val credentials = call.receive<LoginCredentials>()

            if (checkLogin(credentials)) {
                val token = createJwtToken(credentials.userId)
                call.respond(HttpStatusCode.OK, token)
            } else {
                call.respond(HttpStatusCode.Unauthorized, "Invalid credentials")
            }
        }

        post("/secured") {
            call.respond(HttpStatusCode.OK, "Secured resource")
        }
    }
}

data class LoginCredentials(val userId: String, val password: String)

fun checkLogin(credentials: LoginCredentials): Boolean {
    // 로그인 정보 확인 로직
    return true
}

위 예제에서는 Ktor의 ktor-auth-jwt 모듈을 사용하여 JWT 인증을 구현합니다.

이제 이 예제를 기반으로 웹 서버에서 인증 토큰을 활용할 수 있습니다.

결론

코틀린을 사용하여 웹 서버를 개발할 때 인증 토큰을 활용하는 방법을 살펴보았습니다. JWT를 사용하여 간단하게 인증을 구현할 수 있으며, Ktor와 조합하여 쉽게 코틀린 웹 서버에서 사용할 수 있습니다.