{"id":26408,"date":"2024-10-27T10:52:31","date_gmt":"2024-10-27T10:52:31","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=26408"},"modified":"2024-11-26T07:44:26","modified_gmt":"2024-11-26T07:44:26","slug":"%ec%8a%a4%ed%94%84%eb%a7%81-%eb%b6%80%ed%8a%b8-%eb%b0%b1%ec%97%94%eb%93%9c-%ea%b0%9c%eb%b0%9c-%ea%b0%95%ec%a2%8c-jwt%eb%a1%9c-%eb%a1%9c%ea%b7%b8%ec%9d%b8-%eb%a1%9c%ea%b7%b8%ec%95%84%ec%9b%83-11","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/26408\/","title":{"rendered":"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30"},"content":{"rendered":"<p><body><\/p>\n<h2>1. \uc11c\ub860<\/h2>\n<p>\uc2a4\ud504\ub9c1 \ubd80\ud2b8(Spring Boot)\ub294 Java \uae30\ubc18 \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc190\uc27d\uac8c \uac1c\ubc1c\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc8fc\ub294 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. \ucd5c\uadfc \ub4e4\uc5b4 \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ub300\ud55c \uc218\uc694\uac00 \uae09\uc99d\ud558\uba74\uc11c, \ubcf4\uc548 \ubc0f \uc778\uc99d\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc911\uc694\ud574\uc84c\uc2b5\ub2c8\ub2e4. \uc774 \uac15\uc88c\uc5d0\uc11c\ub294 JSON Web Token(JWT)\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub85c\uadf8\uc778 \ubc0f \ub85c\uadf8\uc544\uc6c3 \uae30\ub2a5\uc744 \uad6c\ud604\ud558\uace0, \ud544\ud130\ub97c \ud1b5\ud574 JWT \ud1a0\ud070\uc744 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \uacfc\uc815\uc5d0\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc758 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \ud65c\uc6a9\ud558\uc5ec \ub354 \uc548\uc804\ud558\uace0 \ud6a8\uc728\uc801\uc778 \ubc31\uc5d4\ub4dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\ub294 \ubc95\uc744 \ubc30\uc6b0\uac8c \ub420 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<h2>2. JWT\ub780 \ubb34\uc5c7\uc778\uac00?<\/h2>\n<p>JSON Web Token(JWT)\uc740 \ub450 \uac1c\uc758 \uc5d4\ud2f0\ud2f0 \uac04\uc5d0 \uc815\ubcf4\ub97c \uc548\uc804\ud558\uac8c \uc804\uc1a1\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ud558\ub294 JSON \uae30\ubc18\uc758 \uc624\ube0c\uc81d\ud2b8\uc785\ub2c8\ub2e4. JWT\ub294 \uc0ac\uc6a9\uc790 \uc778\uc99d\ubfd0\ub9cc \uc544\ub2c8\ub77c, \ud074\ub808\uc784 \uae30\ubc18\uc758 \uc815\ubcf4 \uc804\uc1a1\uc744 \uc704\ud55c \ud45c\uc900\uc73c\ub85c \uc790\ub9ac \uc7a1\uace0 \uc788\uc2b5\ub2c8\ub2e4. JWT\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc138 \uac00\uc9c0 \uad6c\uc131 \uc694\uc18c\ub85c \ub098\ub269\ub2c8\ub2e4:<\/p>\n<ul>\n<li><strong>\ud5e4\ub354(Header):<\/strong> JWT\uc758 \ud0c0\uc785\uacfc \ud574\uc2f1 \uc54c\uace0\ub9ac\uc998\uc744 \uc815\uc758\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>\ud398\uc774\ub85c\ub4dc(Payload):<\/strong> \uc804\uc1a1\ud558\ub824\ub294 \ud074\ub808\uc784 \uc815\ubcf4\uac00 \ud3ec\ud568\ub429\ub2c8\ub2e4.<\/li>\n<li><strong>\uc11c\uba85(Signature):<\/strong> \ud5e4\ub354\uc640 \ud398\uc774\ub85c\ub4dc\ub97c \uacb0\ud569\ud55c \ud6c4 \ube44\ubc00 \ud0a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc0dd\uc131\ub429\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 JWT\uc758 \ubb34\uacb0\uc131\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h2>3. \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ud504\ub85c\uc81d\ud2b8 \uc124\uc815\ud558\uae30<\/h2>\n<p>\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ud504\ub85c\uc81d\ud2b8\ub97c \uc2dc\uc791\ud558\ub824\uba74 \uae30\ubcf8\uc801\uc778 \uc124\uc815\ubd80\ud130 \ud574\uc57c \ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc124\uc815\uc744 \uc704\ud574 \uc2a4\ud504\ub9c1 \uc774\ub2c8\uc15c\ub77c\uc774\uc800(Spring Initializr)\ub97c \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131 \uc2dc \uc120\ud0dd\ud574\uc57c \ud560 \uc0ac\ud56d\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/p>\n<ul>\n<li>Project: Maven Project<\/li>\n<li>Language: Java<\/li>\n<li>Spring Boot: Stable version (Latest)<\/li>\n<li>Dependencies: Spring Web, Spring Security, Spring Data JPA, Spring Boot DevTools, H2 Database<\/li>\n<\/ul>\n<p>\ud504\ub85c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub418\uba74 IDE\uc5d0\uc11c \uc5f4\uace0, \ud544\uc694\ud55c \uc758\uc874\uc131\uc744 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>4. \uc5d4\ud2f0\ud2f0 \ud074\ub798\uc2a4 \ubc0f \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131\ud558\uae30<\/h2>\n<p>\uc6b0\uc120 \uc720\uc800(User) \uc5d4\ud2f0\ud2f0\ub97c \uc815\uc758\ud574\uc57c \ud569\ub2c8\ub2e4. \uac04\ub2e8\ud55c User \uc5d4\ud2f0\ud2f0\ub294 \uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \ud074\ub798\uc2a4\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc6b0\ub9ac\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc0c1\ud638\uc791\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>package com.example.demo.entity;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.GenerationType;\nimport javax.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}\n<\/code><\/pre>\n<p>\ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub294 \uc5d4\ud2f0\ud2f0\uc640 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 CRUD \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \ub370 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>package com.example.demo.repository;\n\nimport com.example.demo.entity.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface UserRepository extends JpaRepository&lt;User, Long&gt; {\n    User findByUsername(String username);\n}\n<\/code><\/pre>\n<h2>5. \uc11c\ube44\uc2a4 \ud074\ub798\uc2a4 \uc0dd\uc131\ud558\uae30<\/h2>\n<p>\ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ucc98\ub9ac\ud558\ub294 \uc11c\ube44\uc2a4 \ud074\ub798\uc2a4\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc774 \ud074\ub798\uc2a4\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc790 \ub4f1\ub85d, \ub85c\uadf8\uc778 \ub4f1\uc758 \uae30\ub2a5\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>package com.example.demo.service;\n\nimport com.example.demo.entity.User;\nimport com.example.demo.repository.UserRepository;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class UserService {\n    @Autowired\n    private UserRepository userRepository;\n\n    @Autowired\n    private BCryptPasswordEncoder passwordEncoder;\n    \n    public User register(User user) {\n        user.setPassword(passwordEncoder.encode(user.getPassword()));\n        return userRepository.save(user);\n    }\n    \n    public User findUserByUsername(String username) {\n        return userRepository.findByUsername(username);\n    }\n}\n<\/code><\/pre>\n<h2>6. \ubcf4\uc548 \uc124\uc815 \ubc0f JWT \uc0dd\uc131\ud558\uae30<\/h2>\n<p>\uc2a4\ud504\ub9c1 \uc2dc\ud050\ub9ac\ud2f0\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubcf4\uc548\uc744 \uac15\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 SecurityConfig \ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud558\uace0, JWT \ud1a0\ud070\uc744 \uc0dd\uc131\ud558\ub294 \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<pre><code>package com.example.demo.config;\n\nimport com.example.demo.security.JwtAuthenticationFilter;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.authentication.AuthenticationManager;\nimport org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\nimport org.springframework.security.config.annotation.web.configuration.EnableGlobalMethodSecurity;\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\nimport org.springframework.security.crypto.password.PasswordEncoder;\nimport org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;\n\n@Configuration\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class SecurityConfig extends WebSecurityConfigurerAdapter {\n    \n    @Autowired\n    private JwtAuthenticationFilter jwtAuthenticationFilter;\n\n    @Override\n    protected void configure(HttpSecurity http) throws Exception {\n        http.csrf().disable()\n            .authorizeRequests()\n            .antMatchers(\"\/api\/auth\/**\").permitAll()\n            .anyRequest().authenticated()\n            .and()\n            .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);\n    }\n\n    @Bean\n    public PasswordEncoder passwordEncoder() {\n        return new BCryptPasswordEncoder();\n    }\n}\n<\/code><\/pre>\n<h2>7. JWT \uc0dd\uc131 \ubc0f \uac80\uc99d \uad6c\ud604\ud558\uae30<\/h2>\n<p>\ub85c\uadf8\uc778 \uc2dc \uc0ac\uc6a9\uc790\uc758 \uc815\ubcf4\ub97c \ubc14\ud0d5\uc73c\ub85c JWT\ub97c \uc0dd\uc131\ud558\uc5ec \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \uc804\ub2ec\ud569\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 JWT \uc720\ud2f8\ub9ac\ud2f0 \ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud558\uc5ec \ud1a0\ud070 \uc0dd\uc131 \ubc0f \uac80\uc99d \uc791\uc5c5\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>package com.example.demo.security;\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    \n    private final String SECRET_KEY = \"secret_key\";\n    private final long EXPIRATION_TIME = 86400000; \/\/ 1 day\n\n    public String generateToken(String username) {\n        Map&lt;String, Object&gt; claims = new HashMap&lt;&gt;();\n        return createToken(claims, username);\n    }\n\n    private String createToken(Map&lt;String, Object&gt; 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    public boolean validateToken(String token, String username) {\n        final String extractedUsername = extractUsername(token);\n        return (extractedUsername.equals(username) &amp;&amp; !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 Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getExpiration();\n    }\n\n    public String extractUsername(String token) {\n        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();\n    }\n}\n<\/code><\/pre>\n<h2>8. \ub85c\uadf8\uc778 \ubc0f \ub85c\uadf8\uc544\uc6c3 \uae30\ub2a5 \uad6c\ud604\ud558\uae30<\/h2>\n<p>\uc774\uc81c \uc0ac\uc6a9\uc790\uac00 \ub85c\uadf8\uc778\ud558\uba74 JWT\ub97c \ubc1c\uae09\ubc1b\uace0, \ub85c\uadf8\uc544\uc6c3 \uc2dc\uc5d0\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ud1a0\ud070\uc744 \uc0ad\uc81c\ud558\ub294 \ubc29\uc2dd\uc73c\ub85c \uad6c\ud604\ud569\ub2c8\ub2e4. \uc544\ub798\ub294 \ub85c\uadf8\uc778 API\uc758 \uc608\uc2dc\uc785\ub2c8\ub2e4.<\/p>\n<pre><code>package com.example.demo.controller;\n\nimport com.example.demo.entity.User;\nimport com.example.demo.security.JwtUtil;\nimport com.example.demo.service.UserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\n\n@RestController\n@RequestMapping(\"\/api\/auth\")\npublic class AuthController {\n\n    @Autowired\n    private UserService userService;\n\n    @Autowired\n    private JwtUtil jwtUtil;\n\n    @PostMapping(\"\/login\")\n    public ResponseEntity&lt;String&gt; login(@RequestBody User user) {\n        User foundUser = userService.findUserByUsername(user.getUsername());\n        if (foundUser != null &amp;&amp; passwordEncoder.matches(user.getPassword(), foundUser.getPassword())) {\n            return ResponseEntity.ok(jwtUtil.generateToken(foundUser.getUsername()));\n        }\n        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(\"Invalid credentials\");\n    }\n\n    @PostMapping(\"\/logout\")\n    public ResponseEntity&lt;String&gt; logout() {\n        \/\/ \ub85c\uadf8\uc544\uc6c3 \uae30\ub2a5\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8 \uce21\uc5d0\uc11c \uad6c\ud604\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.\n        return ResponseEntity.ok(\"Successfully logged out.\");\n    }\n}\n<\/code><\/pre>\n<h2>9. JWT \ud544\ud130 \uad6c\ud604\ud558\uae30<\/h2>\n<p>JWT \ud544\ud130\ub97c \uad6c\ud604\ud558\uc5ec \ubaa8\ub4e0 \uc694\uccad\uc5d0\uc11c JWT\ub97c \uac80\uc99d\ud558\uace0, \uc778\uc99d\uc744 \ucc98\ub9ac\ud558\ub294 \uacfc\uc815\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 JwtAuthenticationFilter \ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>package com.example.demo.security;\n\nimport io.jsonwebtoken.ExpiredJwtException;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.authentication.UsernamePasswordAuthenticationToken;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.core.context.SecurityContextHolder;\nimport org.springframework.web.filter.OncePerRequestFilter;\n\nimport javax.servlet.FilterChain;\nimport javax.servlet.ServletException;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\npublic class JwtAuthenticationFilter extends OncePerRequestFilter {\n\n    @Autowired\n    private JwtUtil jwtUtil;\n\n    @Autowired\n    private UserDetailsService userDetailsService;\n\n    @Override\n    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)\n            throws ServletException, IOException {\n\n        String authorizationHeader = request.getHeader(\"Authorization\");\n\n        String username = null;\n        String jwt = null;\n\n        if (authorizationHeader != null &amp;&amp; authorizationHeader.startsWith(\"Bearer \")) {\n            jwt = authorizationHeader.substring(7);\n            try {\n                username = jwtUtil.extractUsername(jwt);\n            } catch (ExpiredJwtException e) {\n                System.out.println(\"JWT is expired\");\n            }\n\n            if (username != null &amp;&amp; SecurityContextHolder.getContext().getAuthentication() == null) {\n                UserDetails userDetails = userDetailsService.loadUserByUsername(username);\n                if (jwtUtil.validateToken(jwt, userDetails.getUsername())) {\n                    UsernamePasswordAuthenticationToken authenticationToken = \n                            new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());\n                    SecurityContextHolder.getContext().setAuthentication(authenticationToken);\n                }\n            }\n        }\n        filterChain.doFilter(request, response);\n    }\n}\n<\/code><\/pre>\n<h2>10. \uacb0\ub860<\/h2>\n<p>\uc774\ubc88 \uac15\uc88c\uc5d0\uc11c\ub294 \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc774\uc6a9\ud558\uc5ec JWT\ub97c \ud1b5\ud55c \ub85c\uadf8\uc778 \ubc0f \ub85c\uadf8\uc544\uc6c3 \uae30\ub2a5\uc744 \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6e0\uc2b5\ub2c8\ub2e4. \uc6b0\ub9ac\ub294 JWT \ud1a0\ud070\uc744 \uc0dd\uc131\ud558\uace0 \uac80\uc99d\ud558\ub294 \ubc29\ubc95, \uadf8\ub9ac\uace0 \uc2a4\ud504\ub9c1 \uc2dc\ud050\ub9ac\ud2f0\ub97c \ud65c\uc6a9\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubcf4\uc548\uc744 \uac15\ud654\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c\ub3c4 \uc54c\uc544\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \uc774 \uacfc\uc815\uc744 \ud1b5\ud574 \ubc31\uc5d4\ub4dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc778\uc99d \ubc0f \uad8c\ud55c \uad00\ub9ac\ub97c \ub354 \uc548\uc804\ud558\uac8c \ucc98\ub9ac\ud560 \uc218 \uc788\ub294 \uae30\ubc18\uc744 \ub9c8\ub828\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub354\ubd88\uc5b4, \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc758 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \ud65c\uc6a9\ud558\uc5ec \ud6a8\uc728\uc801\uc774\uace0 \uc548\uc804\ud55c \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc744 \uc2e4\ud604\ud560 \uc218 \uc788\uc744 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<h2>11. \ucc38\uace0 \uc790\ub8cc<\/h2>\n<ul>\n<li><a href=\"https:\/\/spring.io\/projects\/spring-boot\">Spring Boot Official Documentation<\/a><\/li>\n<li><a href=\"https:\/\/jwt.io\/\">JWT Official Documentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.spring.io\/spring-security\/site\/docs\/current\/reference\/html5\/#basic-web-app\">Spring Security Official Documentation<\/a><\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. \uc11c\ub860 \uc2a4\ud504\ub9c1 \ubd80\ud2b8(Spring Boot)\ub294 Java \uae30\ubc18 \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc190\uc27d\uac8c \uac1c\ubc1c\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc8fc\ub294 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. \ucd5c\uadfc \ub4e4\uc5b4 \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ub300\ud55c \uc218\uc694\uac00 \uae09\uc99d\ud558\uba74\uc11c, \ubcf4\uc548 \ubc0f \uc778\uc99d\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc911\uc694\ud574\uc84c\uc2b5\ub2c8\ub2e4. \uc774 \uac15\uc88c\uc5d0\uc11c\ub294 JSON Web Token(JWT)\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub85c\uadf8\uc778 \ubc0f \ub85c\uadf8\uc544\uc6c3 \uae30\ub2a5\uc744 \uad6c\ud604\ud558\uace0, \ud544\ud130\ub97c \ud1b5\ud574 JWT \ud1a0\ud070\uc744 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \uacfc\uc815\uc5d0\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc758 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \ud65c\uc6a9\ud558\uc5ec \ub354 \uc548\uc804\ud558\uace0 &hellip; <a href=\"https:\/\/atmokpo.com\/w\/26408\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30&#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":[21],"tags":[],"class_list":["post-26408","post","type-post","status-publish","format-standard","hentry","category-21"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30 - \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\/26408\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"1. \uc11c\ub860 \uc2a4\ud504\ub9c1 \ubd80\ud2b8(Spring Boot)\ub294 Java \uae30\ubc18 \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc190\uc27d\uac8c \uac1c\ubc1c\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc8fc\ub294 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. \ucd5c\uadfc \ub4e4\uc5b4 \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ub300\ud55c \uc218\uc694\uac00 \uae09\uc99d\ud558\uba74\uc11c, \ubcf4\uc548 \ubc0f \uc778\uc99d\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc911\uc694\ud574\uc84c\uc2b5\ub2c8\ub2e4. \uc774 \uac15\uc88c\uc5d0\uc11c\ub294 JSON Web Token(JWT)\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub85c\uadf8\uc778 \ubc0f \ub85c\uadf8\uc544\uc6c3 \uae30\ub2a5\uc744 \uad6c\ud604\ud558\uace0, \ud544\ud130\ub97c \ud1b5\ud574 JWT \ud1a0\ud070\uc744 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \uacfc\uc815\uc5d0\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc758 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \ud65c\uc6a9\ud558\uc5ec \ub354 \uc548\uc804\ud558\uace0 &hellip; \ub354 \ubcf4\uae30 &quot;\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/26408\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-27T10:52:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-26T07:44:26+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=\"4\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/26408\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/26408\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30\",\"datePublished\":\"2024-10-27T10:52:31+00:00\",\"dateModified\":\"2024-11-26T07:44:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/26408\/\"},\"wordCount\":76,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc564\ub4dc \uac1c\ubc1c \uac15\uc88c\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/26408\/\",\"url\":\"https:\/\/atmokpo.com\/w\/26408\/\",\"name\":\"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-10-27T10:52:31+00:00\",\"dateModified\":\"2024-11-26T07:44:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/26408\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/26408\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/26408\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30\"}]},{\"@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":"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30 - \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\/26408\/","og_locale":"ko_KR","og_type":"article","og_title":"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"1. \uc11c\ub860 \uc2a4\ud504\ub9c1 \ubd80\ud2b8(Spring Boot)\ub294 Java \uae30\ubc18 \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc190\uc27d\uac8c \uac1c\ubc1c\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc8fc\ub294 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. \ucd5c\uadfc \ub4e4\uc5b4 \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ub300\ud55c \uc218\uc694\uac00 \uae09\uc99d\ud558\uba74\uc11c, \ubcf4\uc548 \ubc0f \uc778\uc99d\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc911\uc694\ud574\uc84c\uc2b5\ub2c8\ub2e4. \uc774 \uac15\uc88c\uc5d0\uc11c\ub294 JSON Web Token(JWT)\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub85c\uadf8\uc778 \ubc0f \ub85c\uadf8\uc544\uc6c3 \uae30\ub2a5\uc744 \uad6c\ud604\ud558\uace0, \ud544\ud130\ub97c \ud1b5\ud574 JWT \ud1a0\ud070\uc744 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \uacfc\uc815\uc5d0\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc758 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \ud65c\uc6a9\ud558\uc5ec \ub354 \uc548\uc804\ud558\uace0 &hellip; \ub354 \ubcf4\uae30 \"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30\"","og_url":"https:\/\/atmokpo.com\/w\/26408\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-10-27T10:52:31+00:00","article_modified_time":"2024-11-26T07:44:26+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":"4\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/26408\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/26408\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30","datePublished":"2024-10-27T10:52:31+00:00","dateModified":"2024-11-26T07:44:26+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/26408\/"},"wordCount":76,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc564\ub4dc \uac1c\ubc1c \uac15\uc88c"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/26408\/","url":"https:\/\/atmokpo.com\/w\/26408\/","name":"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-10-27T10:52:31+00:00","dateModified":"2024-11-26T07:44:26+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/26408\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/26408\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/26408\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc31\uc5d4\ub4dc \uac1c\ubc1c \uac15\uc88c, JWT\ub85c \ub85c\uadf8\uc778 \ub85c\uadf8\uc544\uc6c3 \uad6c\ud604, \ud1a0\ud070 \ud544\ud130 \uad6c\ud604\ud558\uae30"}]},{"@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\/26408","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=26408"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/26408\/revisions"}],"predecessor-version":[{"id":26409,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/26408\/revisions\/26409"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=26408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=26408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=26408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}