Skip to main content
7 min read Intermediate Source Code

Kotlin Backend Components and Security Testing

ComponentPurposeTester’s FocusCommon Risks
ControllerHandles HTTP requests, maps endpoints, returns responsesValidate inputs, enforce authentication/authorization, check response encodingXSS if raw data returned, broken access control, insecure direct object references
ServiceContains business logic (rules, workflows)Verify role-based access, logic correctness, edge cases, business rule enforcementMissing authorization checks, logic bypass, privilege escalation
RepositoryData access layer, interacts with DBTest for SQL injection, unsafe queries, proper use of ORM, secure data handlingSQL injection, insecure storage of malicious payloads, improper query building
ModelDefines data structures (entities, DTOs)Validate serialization/deserialization, enforce constraints, check field validationUnsafe data propagation, weak validation, overexposed sensitive fields
ConfigApplication configuration (security, DB, logging)Check security headers, DB credentials, logging practices, environment separationHardcoded secrets, insecure configs, missing HTTPS enforcement
MiddlewareIntercepts requests/responses (logging, auth, error handling)Ensure consistent authentication, logging, error handlingSensitive data leaks, weak auth enforcement, missing rate limiting
UtilsHelper functions (date, string, etc.)Check safe handling of input/output, encoding/decodingUnsafe string handling, weak sanitization, insecure crypto usage
TestsUnit/integration testsReview coverage of security cases, edge cases, negative scenariosMissing tests for edge cases, weak validation coverage, false sense of security

Functions / Methods Cheat Sheet

Function/MethodPurposeTester’s FocusRisk
getUser()Fetch user dataEnsure sensitive info not exposed (e.g., passwords, tokens)Data leakage
findUserById()Retrieve user by IDCheck authorization (can one user access another’s data?)IDOR (Insecure Direct Object Reference)
respondText()Send plain text responseVerify output encoding, escaping of HTMLXSS
saveUser()Create new userValidate input, enforce constraintsInjection attacks, weak validation
updateUser()Update user recordCheck authorization, enforce role-based rulesPrivilege escalation
deleteUser()Delete userEnsure proper permissions, audit loggingUnauthorized deletion
login()Authenticate userTest brute force protection, error messages, secure password handlingWeak authentication, information leakage
generateToken()Issue JWT/sessionCheck expiration, signature validation, secure storageToken replay, weak signing, insecure storage
validateInput()Sanitize/validate inputTest coverage of sanitization (XSS, SQL injection, path traversal)Missed edge cases
handleException()Centralized error handlingCheck error messages, ensure no sensitive info leaksStack trace exposure, sensitive data leaks

Libraries Cheat Sheet

LibraryPurposeTester’s FocusRisk
Ktor / Spring BootWeb frameworkCheck routing, middleware defaults, error handlingMisconfigured endpoints, insecure defaults
Exposed / HibernateDatabase ORMEnsure parameterized queries, safe query buildingSQL injection, unsafe native queries
Jackson / Kotlinx SerializationJSON handlingTest safe serialization, avoid exposing sensitive fieldsUnsafe data injection, overexposed fields
Auth0/JWTToken handlingValidate token security, expiration, signatureWeak token validation, replay attacks
Logback/SLF4JLoggingCheck sensitive data logging, log rotationCredential leaks, log injection
JUnit/MockitoTestingEnsure security tests exist, negative cases coveredMissing coverage, false positives
Koin/DaggerDependency injectionCheck secure DI config, avoid insecure singletonsMisconfigured injection, insecure defaults

Interfaces Cheat Sheet

InterfacePurposeTester’s FocusRisk
UserRepositoryAbstract DB operationsEnsure secure DB calls, parameterized queriesSQL injection
AuthServiceAuthentication contractVerify consistent use across endpointsWeak authentication enforcement
PaymentGatewayExternal integrationCheck API key security, HTTPS usageInsecure external calls, key leakage
EmailServiceSend emailsTest for injection, safe content handlingEmail header injection, spam relay
CacheProviderCache dataCheck sensitive data handling, expiration policiesToken leakage, stale data exposure

Java vs Kotlin Backend Components

Aspect / ComponentJava (Annotation‑Driven)Kotlin (DSL‑Driven)
Common FrameworksSpring Boot → Full‑stack web framework, annotation‑driven, enterprise‑ready.
Spring MVC → Handles routing/controllers (@RestController, @GetMapping).
Spring Security → Authentication, authorization, CSRF protection (@EnableWebSecurity, @PreAuthorize).
Hibernate / JPA → ORM for DB mapping (@Entity, @Repository).
Micronaut / Quarkus → Modern alternatives to Spring, faster startup, cloud‑native.
Ktor → Lightweight Kotlin‑native web framework, DSL routing, coroutine‑friendly.
Exposed → SQL DSL/ORM for Kotlin, type‑safe queries.
Koin → Dependency injection with Kotlin DSL (module { single { UserService() } }).
Arrow → Functional programming library (immutability, type safety).
Micronaut (Kotlin support) → Alternative to Ktor for microservices.
Controller / Routing@RestController → Marks REST controller.
@GetMapping("/users") → Maps GET requests.
@PostMapping("/users") → Maps POST requests.
@RequestMapping("/api") → Base path for endpoints.
routing { get("/users") { call.respondText("All users") } post("/users") { call.respond(HttpStatusCode.Created) } }
Dependency Injection@Autowired → Injects a bean.
@Component → Marks a Spring bean.
@Service → Marks business logic class.
@Repository → Marks DB access class.
val myModule = module { single { UserService() } single { UserRepository(get()) } }
startKoin { modules(myModule) }
Models / Entities@Entity → Marks DB entity.
@Table(name="users") → Maps to DB table.
@Id → Primary key.
@Column(nullable=false) → Column constraints.
@Serializable data class User(val id: Int, val name: String)
Exposed DSL: object Users : Table() { val id = integer("id").autoIncrement() val name = varchar("name", 255) }
Repository / DB Accessinterface UserRepository extends JpaRepository<User, Long> → Auto CRUD.
@Query("SELECT u FROM User u WHERE u.name = ?1") → Custom query.
Users.select { Users.name eq "Alice" }.map { it[Users.id] }
transaction { User.new { name = "Alice" } }
Configuration@Configuration → Marks config class.
@Bean → Defines a bean.
application.properties / application.yml → External configs.
application.conf (HOCON).
Ktor DSL: install(ContentNegotiation) { json() }
Middleware / FiltersOncePerRequestFilter → Custom filter.
HandlerInterceptor → Pre/post request handling.
Ktor plugins: install(Authentication) { jwt { ... } }
install(CallLogging)
Error Handling@ControllerAdvice → Global error handler.
@ExceptionHandler(Exception.class) → Handle specific exceptions.
install(StatusPages) { exception<Throwable> { call.respond(HttpStatusCode.InternalServerError) } }
SerializationJackson: @JsonProperty("username") → Maps JSON field.
@JsonIgnore → Excludes field.
kotlinx.serialization: @Serializable data class User(val id: Int, val name: String)
SecuritySpring Security: @EnableWebSecurity → Enables security config.
@PreAuthorize("hasRole('ADMIN')") → Role-based access.
Ktor Authentication plugin: install(Authentication) { jwt { realm = "ktor" validate { ... } } }
LoggingSLF4J + Logback: logger.info("User created")Ktor CallLogging: install(CallLogging) { level = Level.INFO }
Async HandlingJava: CompletableFuture.supplyAsync(...)
Spring WebFlux: Mono<User> / Flux<User>
Kotlin coroutines: suspend fun getUser(): User
launch { ... }
API DocumentationSpringDoc OpenAPI: @Operation(summary="Get users")Ktor OpenAPI plugin: install(OpenAPI) { ... }
TestingJUnit: @Test void testUser() { ... }
Mockito: @Mock, @InjectMocks
JUnit + MockK: @Test fun testUser() { coEvery { repo.findUser() } returns User(1,"Alice") }

Security Testing Checklist per Layer

Client Request → Controller → Service → Repository → Database → Response

  • Client Request: Test malformed inputs, fuzzing, injection attempts.
  • Controller: Validate inputs, enforce authentication/authorization, check response encoding, test error handling.
  • Service: Verify business rules, role-based access, edge cases, data validation.
  • Repository: Test for SQL injection, parameterized queries, secure data handling, audit logging.
  • Database: Check encryption of sensitive fields, least privilege access, stored payloads, backups.
  • Response: Confirm output encoding, generic error messages, no sensitive data exposure, secure headers.