{"id":32981,"date":"2024-11-01T09:12:54","date_gmt":"2024-11-01T09:12:54","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=32981"},"modified":"2024-11-01T11:29:30","modified_gmt":"2024-11-01T11:29:30","slug":"spring-boot-backend-development-course-implementing-login-and-logout-with-jwt-jwt","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/32981\/","title":{"rendered":"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT"},"content":{"rendered":"<p><body><\/p>\n<p>Hello! In this blog post, we will explain how to develop a backend service using Spring Boot and implement login and logout functions using JSON Web Token (JWT). JWT is a widely used method for transmitting and validating authentication information in web applications. Through this tutorial, we will explore the concept of JWT in detail and its implementation.<\/p>\n<h2>Table of Contents<\/h2>\n<ol>\n<li><a href=\"#jwt-concept\">1. JWT Concept<\/a><\/li>\n<li><a href=\"#spring-boot-project-setup\">2. Spring Boot Project Setup<\/a><\/li>\n<li><a href=\"#entity-configuration\">3. Entity Configuration<\/a><\/li>\n<li><a href=\"#jwt-creation-and-validation\">4. JWT Creation and Validation<\/a><\/li>\n<li><a href=\"#login-function-implementation\">5. Login Function Implementation<\/a><\/li>\n<li><a href=\"#logout-function-implementation\">6. Logout Function Implementation<\/a><\/li>\n<li><a href=\"#comprehensive-test\">7. Comprehensive Test<\/a><\/li>\n<li><a href=\"#conclusion\">8. Conclusion<\/a><\/li>\n<\/ol>\n<h2 id=\"jwt-concept\">1. JWT Concept<\/h2>\n<p>JWT (JSON Web Token) is a representative method for securely transmitting authentication information between two parties. JWT consists of three parts:<\/p>\n<ul>\n<li><strong>Header<\/strong>: Contains the type of token (JWT) and algorithm information.<\/li>\n<li><strong>Payload<\/strong>: Includes user information and other claims.<\/li>\n<li><strong>Signature<\/strong>: A signature created based on the Header and Payload, ensuring integrity.<\/li>\n<\/ul>\n<p>The main advantage of JWT is that it allows information to be maintained on the client side, eliminating the need for the server to manage state. This is particularly useful in distributed systems or microservices architectures.<\/p>\n<h2 id=\"spring-boot-project-setup\">2. Spring Boot Project Setup<\/h2>\n<p>Let&#8217;s start by creating a simple RESTful API using Spring Boot. We will manage libraries using Maven.<\/p>\n<pre><code>pom.xml<\/code><\/pre>\n<pre><code>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n    &lt;groupId&gt;com.example&lt;\/groupId&gt;\n    &lt;artifactId&gt;jwt-demo&lt;\/artifactId&gt;\n    &lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\n    &lt;packaging&gt;jar&lt;\/packaging&gt;\n\n    &lt;name&gt;jwt-demo&lt;\/name&gt;\n    &lt;description&gt;JWT Demo Project&lt;\/description&gt;\n\n    &lt;properties&gt;\n        &lt;java.version&gt;17&lt;\/java.version&gt;\n        &lt;spring-boot.version&gt;2.6.6&lt;\/spring-boot.version&gt;\n    &lt;\/properties&gt;\n\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;io.jsonwebtoken&lt;\/groupId&gt;\n            &lt;artifactId&gt;jjwt&lt;\/artifactId&gt;\n            &lt;version&gt;0.9.1&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-security&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.h2database&lt;\/groupId&gt;\n            &lt;artifactId&gt;h2&lt;\/artifactId&gt;\n            &lt;scope&gt;runtime&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n\n    &lt;build&gt;\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n&lt;\/project&gt;\n<\/code><\/pre>\n<p>After setting up the necessary dependencies as shown above, create the project directory and write the application class.<\/p>\n<pre><code>src\/main\/java\/com\/example\/jwtdemo\/JwtDemoApplication.java<\/code><\/pre>\n<pre><code>\npackage com.example.jwtdemo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class JwtDemoApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(JwtDemoApplication.class, args);\n    }\n}\n<\/code><\/pre>\n<h2 id=\"entity-configuration\">3. Entity Configuration<\/h2>\n<p>To manage users, we will configure a User entity. This entity is needed to store user information.<\/p>\n<pre><code>src\/main\/java\/com\/example\/jwtdemo\/model\/User.java<\/code><\/pre>\n<pre><code>\npackage com.example.jwtdemo.model;\n\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.GenerationType;\nimport jakarta.persistence.Id;\n\n@Entity\npublic class User {\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n    private String username;\n    private String password;\n\n    \/\/ Getters and setters\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n}\n<\/code><\/pre>\n<h2 id=\"jwt-creation-and-validation\">4. JWT Creation and Validation<\/h2>\n<p>Now, let&#8217;s write a utility class to create and validate JWTs. This class will include methods to create and validate JWT tokens.<\/p>\n<pre><code>src\/main\/java\/com\/example\/jwtdemo\/util\/JwtUtil.java<\/code><\/pre>\n<pre><code>\npackage com.example.jwtdemo.util;\n\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.SignatureAlgorithm;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Map;\n\n@Component\npublic class JwtUtil {\n    private final String SECRET_KEY = \"secret\"; \/\/ Secret key\n    private final int EXPIRATION_TIME = 1000 * 60 * 60; \/\/ 1 hour\n\n    \/\/ Generate JWT\n    public String generateToken(String username) {\n        Map<String, Object> claims = new HashMap<>();\n        return createToken(claims, username);\n    }\n\n    private String createToken(Map<String, Object> claims, String subject) {\n        return Jwts.builder()\n                .setClaims(claims)\n                .setSubject(subject)\n                .setIssuedAt(new Date(System.currentTimeMillis()))\n                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))\n                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)\n                .compact();\n    }\n\n    \/\/ Validate JWT\n    public boolean validateToken(String token, String username) {\n        final String extractedUsername = extractUsername(token);\n        return (extractedUsername.equals(username) && !isTokenExpired(token));\n    }\n\n    private boolean isTokenExpired(String token) {\n        return extractExpiration(token).before(new Date());\n    }\n\n    private Date extractExpiration(String token) {\n        return extractAllClaims(token).getExpiration();\n    }\n\n    private Claims extractAllClaims(String token) {\n        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();\n    }\n\n    public String extractUsername(String token) {\n        return extractAllClaims(token).getSubject();\n    }\n}\n<\/code><\/pre>\n<h2 id=\"login-function-implementation\">5. Login Function Implementation<\/h2>\n<p>Now we will implement the login function. If the user provides valid credentials, we will generate and return a JWT.<\/p>\n<pre><code>src\/main\/java\/com\/example\/jwtdemo\/controller\/AuthController.java<\/code><\/pre>\n<pre><code>\npackage com.example.jwtdemo.controller;\n\nimport com.example.jwtdemo.model.User;\nimport com.example.jwtdemo.util.JwtUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n@RestController\n@RequestMapping(\"\/auth\")\npublic class AuthController {\n    @Autowired\n    private JwtUtil jwtUtil;\n\n    @PostMapping(\"\/login\")\n    public Map<String, String> login(@RequestBody User user) {\n        \/\/ This part requires logic to check user information in the database.\n        if (\"test\".equals(user.getUsername()) && \"password\".equals(user.getPassword())) {\n            String token = jwtUtil.generateToken(user.getUsername());\n            Map<String, String> response = new HashMap<>();\n            response.put(\"token\", token);\n            return response;\n        } else {\n            throw new RuntimeException(\"Invalid credentials\");\n        }\n    }\n}\n<\/code><\/pre>\n<h2 id=\"logout-function-implementation\">6. Logout Function Implementation<\/h2>\n<p>Logout is typically performed by deleting or invalidating the JWT on the client side. Generally, logout is handled on the client side.<\/p>\n<p>Here is an example of how to remove the JWT on the client:<\/p>\n<pre><code>\nlocalStorage.removeItem('token');\n<\/code><\/pre>\n<p>Since the server does not manage user state, there is no need for a separate logout endpoint on the server.<\/p>\n<h2 id=\"comprehensive-test\">7. Comprehensive Test<\/h2>\n<p>Now that all implementations are complete, you can test the API using Postman or CURL.<\/p>\n<ul>\n<li><strong>Login Request<\/strong>: <code>POST http:\/\/localhost:8080\/auth\/login<\/code> &#8211; Send user information in JSON format in the Body.<\/li>\n<\/ul>\n<pre><code>\n{\n    \"username\": \"test\",\n    \"password\": \"password\"\n}\n<\/code><\/pre>\n<pre><code>response<\/code><\/pre>\n<pre><code>\n{\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n}\n<\/code><\/pre>\n<p>You can use the received JWT to make other API calls by adding it to the Authorization header as Bearer.<\/p>\n<h2 id=\"conclusion\">8. Conclusion<\/h2>\n<p>In this tutorial, we learned how to implement login and logout functions using JWT with Spring Boot. JWT is a lightweight authentication mechanism that can be effectively applied in various situations. Using JWT in practice can enhance security through efficient authentication and authorization management. We recommend experiencing various features based on JWT in the future.<\/p>\n<p>Thank you! Questions and feedback are welcome in the comments below.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello! In this blog post, we will explain how to develop a backend service using Spring Boot and implement login and logout functions using JSON Web Token (JWT). JWT is a widely used method for transmitting and validating authentication information in web applications. Through this tutorial, we will explore the concept of JWT in detail &hellip; <a href=\"https:\/\/atmokpo.com\/w\/32981\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[131],"tags":[],"class_list":["post-32981","post","type-post","status-publish","format-standard","hentry","category-spring-boot-backend-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/32981\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"Hello! In this blog post, we will explain how to develop a backend service using Spring Boot and implement login and logout functions using JSON Web Token (JWT). JWT is a widely used method for transmitting and validating authentication information in web applications. Through this tutorial, we will explore the concept of JWT in detail &hellip; \ub354 \ubcf4\uae30 &quot;Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/32981\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:12:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:29:30+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"6\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/32981\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32981\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT\",\"datePublished\":\"2024-11-01T09:12:54+00:00\",\"dateModified\":\"2024-11-01T11:29:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32981\/\"},\"wordCount\":465,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"Spring Boot backend development\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/32981\/\",\"url\":\"https:\/\/atmokpo.com\/w\/32981\/\",\"name\":\"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:12:54+00:00\",\"dateModified\":\"2024-11-01T11:29:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32981\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/32981\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/32981\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/atmokpo.com\/w\/32981\/","og_locale":"ko_KR","og_type":"article","og_title":"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"Hello! In this blog post, we will explain how to develop a backend service using Spring Boot and implement login and logout functions using JSON Web Token (JWT). JWT is a widely used method for transmitting and validating authentication information in web applications. Through this tutorial, we will explore the concept of JWT in detail &hellip; \ub354 \ubcf4\uae30 \"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT\"","og_url":"https:\/\/atmokpo.com\/w\/32981\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:12:54+00:00","article_modified_time":"2024-11-01T11:29:30+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"6\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/32981\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/32981\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT","datePublished":"2024-11-01T09:12:54+00:00","dateModified":"2024-11-01T11:29:30+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/32981\/"},"wordCount":465,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["Spring Boot backend development"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/32981\/","url":"https:\/\/atmokpo.com\/w\/32981\/","name":"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:12:54+00:00","dateModified":"2024-11-01T11:29:30+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/32981\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/32981\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/32981\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, JWT"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32981","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=32981"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32981\/revisions"}],"predecessor-version":[{"id":32982,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32981\/revisions\/32982"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=32981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=32981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=32981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}