{"id":32983,"date":"2024-11-01T09:12:55","date_gmt":"2024-11-01T09:12:55","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=32983"},"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-implementing-a-jwt-service","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/32983\/","title":{"rendered":"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, Implementing a JWT Service"},"content":{"rendered":"<p><body><\/p>\n<header>\n<p>Implementing Login\/Logout with JWT<\/p>\n<\/header>\n<section>\n<h2>Table of Contents<\/h2>\n<ol>\n<li>Introduction<\/li>\n<li>Introduction to Spring Boot<\/li>\n<li>What is JWT?<\/li>\n<li>Project Setup<\/li>\n<li>Implementing Registration Feature<\/li>\n<li>Implementing Login Feature<\/li>\n<li>Authentication and Authorization using JWT<\/li>\n<li>Creating and Validating JWT Tokens<\/li>\n<li>Implementing Logout Feature<\/li>\n<li>Conclusion<\/li>\n<\/ol>\n<\/section>\n<section>\n<h2>Introduction<\/h2>\n<p>Recently, authentication and authorization have become very important issues in web applications. Especially when developing RESTful APIs, there are many considerations in handling user authentication because multiple clients need to be supported. Today, we will explore how to implement a login and logout system based on JWT (JSON Web Token) using Spring Boot.<\/p>\n<\/section>\n<section>\n<h2>Introduction to Spring Boot<\/h2>\n<p>Spring Boot is a project created to simplify application initialization and configuration in the Spring framework, which is a Java-based web application framework. Spring Boot automatically manages the necessary configurations and dependencies, allowing developers to focus on business logic.<\/p>\n<p>Spring Boot offers several advantages:<\/p>\n<ul>\n<li>Allows for quick prototype development.<\/li>\n<li>Basic configurations are automatically handled.<\/li>\n<li>Includes an embedded Tomcat server, eliminating the need for separate server configuration.<\/li>\n<\/ul>\n<\/section>\n<section>\n<h2>What is JWT?<\/h2>\n<p>JWT (JSON Web Token) is a compact and independent standard for securely transmitting information using JSON format. JWT is widely used to handle user authentication and authorization in web applications. The features of JWT include:<\/p>\n<ul>\n<li>Self-contained reliability: The transmitted data is signed and can be verified.<\/li>\n<li>Simple structure for easy parsing.<\/li>\n<li>Can be transmitted via HTTP headers, providing good compatibility with various clients.<\/li>\n<\/ul>\n<p>JWT consists of three components:<\/p>\n<ul>\n<li>Header: Contains token type and signing algorithm information.<\/li>\n<li>Payload: Contains user information and claims.<\/li>\n<li>Signature: Ensures the integrity of the data by signing based on the header and payload.<\/li>\n<\/ul>\n<\/section>\n<section>\n<h2>Project Setup<\/h2>\n<p>To create a Spring Boot project, we use <a href=\"https:\/\/start.spring.io\/\" target=\"_blank\" rel=\"noopener\">Spring Initializr<\/a>. Select the necessary dependencies such as Web, JPA, Spring Security, Lombok, and JWT library.<\/p>\n<pre><code>\n        <groupid>com.example<\/groupid>\n        <artifactid>jwt-demo<\/artifactid>\n        <version>0.0.1-SNAPSHOT<\/version>\n        <packaging>jar<\/packaging>\n\n        <dependencies>\n            <dependency>\n                <groupid>org.springframework.boot<\/groupid>\n                <artifactid>spring-boot-starter-web<\/artifactid>\n            <\/dependency>\n            <dependency>\n                <groupid>org.springframework.boot<\/groupid>\n                <artifactid>spring-boot-starter-data-jpa<\/artifactid>\n            <\/dependency>\n            <dependency>\n                <groupid>org.springframework.boot<\/groupid>\n                <artifactid>spring-boot-starter-security<\/artifactid>\n            <\/dependency>\n            <dependency>\n                <groupid>io.jsonwebtoken<\/groupid>\n                <artifactid>jjwt<\/artifactid>\n                <version>0.9.1<\/version>\n            <\/dependency>\n            <dependency>\n                <groupid>org.projectlombok<\/groupid>\n                <artifactid>lombok<\/artifactid>\n                <version>1.18.12<\/version>\n                <scope>provided<\/scope>\n            <\/dependency>\n            <dependency>\n                <groupid>com.h2database<\/groupid>\n                <artifactid>h2<\/artifactid>\n                <scope>runtime<\/scope>\n            <\/dependency>\n        <\/dependencies>\n        <\/code><\/pre>\n<p>After adding the above dependencies to the build.gradle file, set up the Spring Boot application. Write database connection and JPA settings in the <code>application.properties<\/code> file.<\/p>\n<\/section>\n<section>\n<h2>Implementing Registration Feature<\/h2>\n<p>The registration feature essentially allows the user&#8217;s provided information to be stored in the database. A JPA entity class is created to save user information.<\/p>\n<pre><code>\n        import lombok.AllArgsConstructor;\n        import lombok.Getter;\n        import lombok.NoArgsConstructor;\n        import lombok.Setter;\n\n        import javax.persistence.*;\n\n        @Entity\n        @Table(name = \"users\")\n        @Getter @Setter @NoArgsConstructor @AllArgsConstructor\n        public class User {\n            @Id\n            @GeneratedValue(strategy = GenerationType.IDENTITY)\n            private Long id;\n\n            @Column(unique = true, nullable = false)\n            private String username;\n\n            @Column(nullable = false)\n            private String password;\n\n            private String role;\n        }\n        <\/code><\/pre>\n<p>Create a repository interface to handle the user information provided during registration.<\/p>\n<pre><code>\n        import org.springframework.data.jpa.repository.JpaRepository;\n\n        public interface UserRepository extends JpaRepository<User, Long> {\n            User findByUsername(String username);\n        }\n        <\/code><\/pre>\n<p>Create a service class to handle the registration requests.<\/p>\n<pre><code>\n        import org.springframework.beans.factory.annotation.Autowired;\n        import org.springframework.security.crypto.password.PasswordEncoder;\n        import org.springframework.stereotype.Service;\n\n        @Service\n        public class UserService {\n            @Autowired\n            private UserRepository userRepository;\n\n            @Autowired\n            private PasswordEncoder passwordEncoder;\n\n            public void registerUser(User user) {\n                user.setPassword(passwordEncoder.encode(user.getPassword()));\n                user.setRole(\"ROLE_USER\");\n                userRepository.save(user);\n            }\n        }\n        <\/code><\/pre>\n<\/section>\n<section>\n<h2>Implementing Login Feature<\/h2>\n<p>The login feature is the process where a user provides authentication information to receive a JWT token from the server. To achieve this, we write a filter class that handles authentication.<\/p>\n<pre><code>\n        import org.springframework.beans.factory.annotation.Autowired;\n        import org.springframework.security.authentication.AuthenticationManager;\n        import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;\n        import org.springframework.security.core.Authentication;\n        import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;\n\n        public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {\n            @Autowired\n            private AuthenticationManager authenticationManager;\n\n            @Autowired\n            private JwtTokenProvider jwtTokenProvider;\n\n            @Override\n            public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {\n                String username = request.getParameter(\"username\");\n                String password = request.getParameter(\"password\");\n                UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);\n                return authenticationManager.authenticate(authRequest);\n            }\n\n            @Override\n            protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {\n                String token = jwtTokenProvider.createToken(authResult.getName());\n                response.addHeader(\"Authorization\", \"Bearer \" + token);\n                response.getWriter().write(\"Login Successful\");\n            }\n        }\n        <\/code><\/pre>\n<\/section>\n<section>\n<h2>Authentication and Authorization using JWT<\/h2>\n<p>This section implements the method to authenticate users when calling an API using JWT. We will create a filter that blocks requests if the JWT token is missing or invalid.<\/p>\n<pre><code>\n        import org.springframework.security.core.Authentication;\n        import org.springframework.security.core.context.SecurityContextHolder;\n        import org.springframework.stereotype.Component;\n        import org.springframework.web.filter.GenericFilterBean;\n\n        import javax.servlet.FilterChain;\n        import javax.servlet.ServletException;\n        import javax.servlet.http.HttpServletRequest;\n        import javax.servlet.http.HttpServletResponse;\n        import java.io.IOException;\n\n        @Component\n        public class JwtAuthenticationFilter extends GenericFilterBean {\n            @Autowired\n            private JwtTokenProvider jwtTokenProvider;\n\n            @Override\n            public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {\n                String token = request.getHeader(\"Authorization\");\n\n                if (token != null && jwtTokenProvider.validateToken(token)) {\n                    Authentication authentication = jwtTokenProvider.getAuthentication(token);\n                    SecurityContextHolder.getContext().setAuthentication(authentication);\n                }\n\n                chain.doFilter(request, response);\n            }\n        }\n        <\/code><\/pre>\n<\/section>\n<section>\n<h2>Creating and Validating JWT Tokens<\/h2>\n<p>Create a utility class for generating and validating JWT tokens. This class will include various methods for handling JWT.<\/p>\n<pre><code>\n        import io.jsonwebtoken.Claims;\n        import io.jsonwebtoken.JwtBuilder;\n        import io.jsonwebtoken.JwtParser;\n        import io.jsonwebtoken.Jwts;\n        import io.jsonwebtoken.SignatureAlgorithm;\n        import org.springframework.stereotype.Component;\n\n        import java.util.Date;\n        import java.util.HashMap;\n        import java.util.Map;\n\n        @Component\n        public class JwtTokenProvider {\n            private final String SECRET_KEY = \"mySecretKey\";\n\n            public String createToken(String username) {\n                Map<String, Object> claims = new HashMap<>();\n                return Jwts.builder()\n                        .setClaims(claims)\n                        .setSubject(username)\n                        .setIssuedAt(new Date())\n                        .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) \/\/ 10 hours\n                        .signWith(SignatureAlgorithm.HS256, SECRET_KEY)\n                        .compact();\n            }\n\n            public boolean validateToken(String token) {\n                try {\n                    Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);\n                    return true;\n                } catch (Exception e) {\n                    return false;\n                }\n            }\n            \n            public Authentication getAuthentication(String token) {\n                \/\/ Implement user authentication logic\n            }\n        }\n        <\/code><\/pre>\n<\/section>\n<section>\n<h2>Implementing Logout Feature<\/h2>\n<p>The logout feature allows the user to terminate authentication, which is usually implemented by deleting the JWT token from the client. Furthermore, if the server needs to invalidate the token, a blacklist must be managed.<\/p>\n<pre><code>\n        import org.springframework.web.bind.annotation.*;\n\n        @RestController\n        @RequestMapping(\"\/auth\")\n        public class AuthController {\n            @PostMapping(\"\/logout\")\n            public ResponseEntity<?> logout(HttpServletRequest request) {\n                String token = request.getHeader(\"Authorization\");\n                \/\/ Logic for registering the token in the blacklist\n                return ResponseEntity.ok(\"Logout Successful\");\n            }\n        }\n        <\/code><\/pre>\n<\/section>\n<section>\n<h2>Conclusion<\/h2>\n<p>In this tutorial, we explored how to implement login\/logout features based on JWT using Spring Boot. JWT is a useful tool for handling authentication and authorization in web services, and it will be a great help in future application development. Additionally, researching more about security and session management can help ensure better security.<\/p>\n<p>If you want to expand your knowledge related to authentication and authorization with JWT, it is recommended to study security best practices along with protocols like OAuth2 and OpenID Connect.<\/p>\n<\/section>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Implementing Login\/Logout with JWT Table of Contents Introduction Introduction to Spring Boot What is JWT? Project Setup Implementing Registration Feature Implementing Login Feature Authentication and Authorization using JWT Creating and Validating JWT Tokens Implementing Logout Feature Conclusion Introduction Recently, authentication and authorization have become very important issues in web applications. Especially when developing RESTful APIs, &hellip; <a href=\"https:\/\/atmokpo.com\/w\/32983\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Spring Boot Backend Development Course, Implementing Login and Logout with JWT, Implementing a JWT Service&#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-32983","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, Implementing a JWT Service - \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\/32983\/\" \/>\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, Implementing a JWT Service - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"Implementing Login\/Logout with JWT Table of Contents Introduction Introduction to Spring Boot What is JWT? Project Setup Implementing Registration Feature Implementing Login Feature Authentication and Authorization using JWT Creating and Validating JWT Tokens Implementing Logout Feature Conclusion Introduction Recently, authentication and authorization have become very important issues in web applications. Especially when developing RESTful APIs, &hellip; \ub354 \ubcf4\uae30 &quot;Spring Boot Backend Development Course, Implementing Login and Logout with JWT, Implementing a JWT Service&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/32983\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:12:55+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=\"5\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/32983\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32983\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, Implementing a JWT Service\",\"datePublished\":\"2024-11-01T09:12:55+00:00\",\"dateModified\":\"2024-11-01T11:29:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32983\/\"},\"wordCount\":594,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"Spring Boot backend development\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/32983\/\",\"url\":\"https:\/\/atmokpo.com\/w\/32983\/\",\"name\":\"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, Implementing a JWT Service - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:12:55+00:00\",\"dateModified\":\"2024-11-01T11:29:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32983\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/32983\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/32983\/#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, Implementing a JWT Service\"}]},{\"@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, Implementing a JWT Service - \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\/32983\/","og_locale":"ko_KR","og_type":"article","og_title":"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, Implementing a JWT Service - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"Implementing Login\/Logout with JWT Table of Contents Introduction Introduction to Spring Boot What is JWT? Project Setup Implementing Registration Feature Implementing Login Feature Authentication and Authorization using JWT Creating and Validating JWT Tokens Implementing Logout Feature Conclusion Introduction Recently, authentication and authorization have become very important issues in web applications. Especially when developing RESTful APIs, &hellip; \ub354 \ubcf4\uae30 \"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, Implementing a JWT Service\"","og_url":"https:\/\/atmokpo.com\/w\/32983\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:12:55+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":"5\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/32983\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/32983\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, Implementing a JWT Service","datePublished":"2024-11-01T09:12:55+00:00","dateModified":"2024-11-01T11:29:30+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/32983\/"},"wordCount":594,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["Spring Boot backend development"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/32983\/","url":"https:\/\/atmokpo.com\/w\/32983\/","name":"Spring Boot Backend Development Course, Implementing Login and Logout with JWT, Implementing a JWT Service - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:12:55+00:00","dateModified":"2024-11-01T11:29:30+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/32983\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/32983\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/32983\/#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, Implementing a JWT Service"}]},{"@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\/32983","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=32983"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32983\/revisions"}],"predecessor-version":[{"id":32984,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32983\/revisions\/32984"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=32983"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=32983"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=32983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}