코틀린은 안전하고 간결한 문법으로 개발자들에게 인기있는 언어입니다. 코틀린을 사용하여 웹 서버를 개발할 때 인증 토큰을 활용하는 방법에 대해 알아보겠습니다.
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를 활용하려면 다음 단계를 따르십시오:
- 클라이언트가 로그인 성공한 후 JWT 토큰을 생성하여 반환합니다.
- 클라이언트는 이 토큰을 미래의 요청에 대한 인증 수단으로 사용합니다.
- 서버는 클라이언트가 보낸 요청의 헤더에서 토큰을 추출하고, 해당 토큰이 유효한지 검증합니다.
- 유효한 경우, 클라이언트의 요청을 처리하고 응답을 반환합니다.
코틀린 웹 프레임워크인 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 인증을 구현합니다.
/login
엔드포인트는 로그인을 처리하고 유효한 경우 JWT 토큰을 반환합니다./secured
엔드포인트는 인증된 클라이언트만 접근할 수 있으며, 유효한 JWT 토큰을 가진 클라이언트에게 “Secured resource”를 반환합니다.
이제 이 예제를 기반으로 웹 서버에서 인증 토큰을 활용할 수 있습니다.
결론
코틀린을 사용하여 웹 서버를 개발할 때 인증 토큰을 활용하는 방법을 살펴보았습니다. JWT를 사용하여 간단하게 인증을 구현할 수 있으며, Ktor와 조합하여 쉽게 코틀린 웹 서버에서 사용할 수 있습니다.