토큰 로그인 | 디스코드 토큰 로그인 하는 방법! 빠른 답변

당신은 주제를 찾고 있습니까 “토큰 로그인 – 디스코드 토큰 로그인 하는 방법!“? 다음 카테고리의 웹사이트 ppa.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 PAPER 이(가) 작성한 기사에는 조회수 7,242회 및 좋아요 55개 개의 좋아요가 있습니다.

토큰 로그인 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 디스코드 토큰 로그인 하는 방법! – 토큰 로그인 주제에 대한 세부정보를 참조하세요

토큰 로그인 주제에 대한 자세한 내용은 여기를 참조하세요.

[무료] 디스코드 토큰으로 로그인하기 – BEAR DIRECTORY

DISCORD. ***설명. 디스코드 토큰이란 디스코드 계정에 고유하게 부여된 알파벳 조합의 코드로, 아이디/비밀번호 대신 토큰을 이용해서 로그인을 할 …

+ 더 읽기

Source: krbear.tistory.com

Date Published: 8/21/2021

View: 6063

토큰으로 Discord에 로그인하는 방법 – FriendGuide.net

토큰으로 Discord에 로그인하는 방법 · 1. 브라우저에서 Discord를 엽니다. · 2. 누르다 CTRL + SHIFT + I · 3. 클릭 Console · 4. 코드를 붙여넣고 ‘PASTE TOKEN HERE’를 귀하 …

+ 여기에 보기

Source: friendguide.net

Date Published: 1/5/2021

View: 1160

Discord Token Login

Logging into a Discord account using a token, made easier. User-friendly approach to sign into Discord accounts, using tokens. Details.

+ 여기를 클릭

Source: chrome.google.com

Date Published: 10/29/2022

View: 1560

JWT 토큰을 이용해서 로그인 인증 구현하기

refresh token이 만료되면 재로그인 요청을 보낸다. 그러나, 이 또한 세션쿠키보다 길이가 길기 때문에 (.을 기준으로 세가지 부위로 나뉨) 인증요청이 …

+ 여기를 클릭

Source: dodop-blog.tistory.com

Date Published: 10/17/2022

View: 8947

[JWT/JSON Web Token] 로그인 / 인증에서 Token 사용하기

[JWT/JSON Web Token] 로그인 / 인증에서 Token 사용하기 … 웹 / 앱 개발을 하면 로그인 과정에서 반드시 만나게 되는 개념이 쿠키-세션 이다.

+ 여기를 클릭

Source: sanghaklee.tistory.com

Date Published: 3/14/2021

View: 9784

로그인 인증 4가지 방법 – velog

Access Token을 이용한 인증. JWT. JWT는 JSON Web Token의 약자로 인증에 필요한 정보들을 암호화시킨 토큰을 …

+ 여기에 보기

Source: velog.io

Date Published: 7/5/2022

View: 3465

[인증/인가]Session(세션)과 Token(토큰)(JWT)의 차이점

이 문제를 해결하기 위한 대표적인 도구 두 가지가 바로 세션(Session)과 토큰(Token)입니다. 유저가 로그인을 시도할 때 서버상에서 일치하는 유저 …

+ 더 읽기

Source: fierycoding.tistory.com

Date Published: 1/1/2022

View: 3642

REST API | Kakao Developers 문서

이 문서는 사용자 로그인 처리 구현 시 참고할 수 있는 정보를 제공합니다. 서비스 서버가 발급받은 액세스 토큰으로 사용자 정보 가져오기를 요청해 사용자의 회원번호 및 …

+ 더 읽기

Source: developers.kakao.com

Date Published: 12/22/2022

View: 721

일반 보안 토큰 로그인 모듈을 사용하여 웹 서비스 인증 – IBM

이러한 요청을 통해 로그인 모듈은 IBM® Tivoli® Federated Identity Manager에 제공된 서비스와 같은 WS-Trust Security Token Service로 토큰을 발행 또는 교환하거나 …

+ 여기에 더 보기

Source: www.ibm.com

Date Published: 9/16/2021

View: 9735

주제와 관련된 이미지 토큰 로그인

주제와 관련된 더 많은 사진을 참조하십시오 디스코드 토큰 로그인 하는 방법!. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

디스코드 토큰 로그인 하는 방법!
디스코드 토큰 로그인 하는 방법!

주제에 대한 기사 평가 토큰 로그인

  • Author: PAPER
  • Views: 조회수 7,242회
  • Likes: 좋아요 55개
  • Date Published: 2021. 7. 19.
  • Video Url link: https://www.youtube.com/watch?v=pRvG3K8alOU

[무료] 디스코드 토큰으로 로그인하기

DISCORD

***설명

디스코드 토큰이란 디스코드 계정에 고유하게 부여된 알파벳 조합의 코드로, 아이디/비밀번호 대신 토큰을 이용해서 로그인을 할 수 있습니다.

(내 토큰 확인은 krbear.tistory.com/6 참고)

***사용방법

브라우저(1번째 방법)

1. 디스코드 로그인 화면에서 ctrl+shift+i를 누른다.

2. 오른쪽에 뜬 창에서 console을 클릭한다.

3. 다음 명령어를 집어넣는다.

function login(token) { setInterval(() => { document.body.appendChild(document.createElement `iframe`).contentWindow.localStorage.token = `”${token}”` }, 50); setTimeout(() => { location.reload(); }, 2500); } login(‘Your Token’)

(your token에 로그인하려고 하는 토큰을 넣어주세요)

4. 끝

설치하기(2번째 방법)

1. 다운로드를 받는다.(링크는 하단에)

2. DiscordTokenLogin을 실행한다.

3. 토큰을 넣고 ‘Login’을 누른다.

4. 끝

저희 디스코드 자료방에 오시면 더많은 자료들을 무료로! 다운받으실 수 있습니다.

BEAR DIRECTORY

discord.com/invite/7dJquZDM6M

토큰으로 Discord에 로그인하는 방법

Discord 토큰이 있으면 이 토큰으로 Discord에 로그인할 수 있습니다.

이것은 당신의 토큰 때문입니다 acts as your login information (이메일 주소와 비밀번호).

다른 사람의 Discord 토큰이 있는 경우 해당 토큰으로 해당 계정에 로그인할 수도 있습니다.

너무 간단하기 때문에, 많이있다 phishing scams online 가짜 Nitro 선물 링크가 포함됩니다.

여기에는 공식 Discord 웹사이트와 유사한 웹사이트가 포함됩니다.

이 웹사이트의 목표는 사람들이 로그인 정보를 제공하거나 QR 코드를 스캔하도록 속이는 것입니다.

이 가이드에서는 토큰으로 Discord에 로그인할 수 있는지 여부, 토큰으로 Discord에 로그인하는 방법, 사람들이 토큰을 훔칠 수 있는지 여부를 배웁니다.

토큰으로 Discord에 로그인할 수 있나요?

예, 토큰으로 Discord에 로그인할 수 있습니다.

토큰으로 Discord 계정에 로그인하려면 먼저 Discord 토큰을 복사해야 합니다.

다른 사람이 귀하의 토큰을 가지고 있는 경우 해당 토큰으로 귀하의 계정에 로그인할 수도 있습니다.

따라서 다음을 수행해야 합니다. never share your Discord token 누구나.

그렇지 않으면 Discord 계정에 대한 전체 액세스 권한을 갖게 됩니다.

사람들이 Discord 토큰을 훔칠 수 있습니까?

예, 사람들이 귀하의 Discord 토큰을 훔칠 수 있습니다.

온라인에는 많은 피싱 사기가 있습니다.

이러한 사기에는 다음과 같은 웹사이트가 포함됩니다. resembles the official Discord website.

웹사이트에서 로그인 정보 또는 Discord 토큰을 입력하라는 메시지가 표시됩니다.

그렇게 하면 계정이 해킹되고 사기 링크가 친구에게 전송됩니다.

토큰으로 Discord에 로그인하는 방법

토큰으로 Discord에 로그인하려면 토큰을 복사하고 브라우저에서 Discord를 열어야 합니다.

두 번째로 누르십시오. CTRL + SHIFT + I 개발자 도구를 열고 Console.

콘솔에서 코드를 붙여넣고 ‘PASTE TOKEN HERE’를 토큰으로 바꿔야 합니다.

마지막으로 Enter 토큰으로 Discord 계정에 로그인합니다.

Discord 이메일 주소나 비밀번호를 모르는 경우에 유용합니다.

방법은 다음과 같습니다. log in to Discord with a token:

1. 브라우저에서 Discord를 엽니다.

토큰으로 Discord에 로그인하려면 먼저 토큰을 복사해야 합니다.

이미 Discord 토큰이 있는 경우 디스코드 웹사이트.

Discord 웹사이트에 들어가면 몇 개의 버튼이 표시됩니다.

여기에는 다음이 포함됩니다. Download for Windows 그리고 Open Discord in your browser.

클릭 Open Discord in your browser Discord의 브라우저 버전을 엽니다.

안타깝게도 Discord 모바일 앱(iPhone/Android)을 사용하는 경우 토큰으로 Discord에 로그인할 수 없습니다.

2. 누르다 CTRL + SHIFT + I

클릭한 후 Open Discord in your browser, Discord의 로그인 페이지로 이동합니다.

이제 개발자 도구를 열어야 합니다.

Discord 콘솔을 사용해야 하기 때문입니다.

개발자 도구를 열려면 CTRL + SHIFT + I 당신의 키보드에.

3. 클릭 Console

를 누른 후 CTRL + SHIFT + I, 개발자 도구가 열립니다.

개발자 도구 상단에 여러 탭이 표시됩니다.

여기에는 다음이 포함됩니다. Elements, Console, Sources, 그리고 더.

클릭 Console Discord 콘솔로 이동합니다.

4. 코드를 붙여넣고 ‘PASTE TOKEN HERE’를 귀하의 토큰으로 바꿉니다.

클릭한 후 Console, Discord 콘솔이 열립니다.

첫째, 당신은해야합니다 copy this code (단순히 토큰으로 Discord 계정에 로그인하는 기능입니다):

function login(token) { setInterval(() => { document.body.appendChild(document.createElement `iframe`).contentWindow.localStorage.token = `”${token}”` }, 50); setTimeout(() => { location.reload(); }, 2500); } login(‘PASTE TOKEN HERE’)

콘솔 아래에 항목을 입력할 수 있는 텍스트 필드가 표시됩니다.

위의 코드를 복사한 후 콘솔 아래의 텍스트 필드에 붙여넣습니다(예, 안전합니다!).

이제 해야 합니다. replace ‘PASTE TOKEN HERE’ with your token.

예를 들어 토큰이 1234abcd, ‘PASTE TOKEN HERE’를 ‘1234abcd’로 바꿔야 합니다(따옴표 제거 없이).

마지막으로, press Enter Discord 계정에 로그인합니다.

5. 성공적으로 로그인했습니다!

‘PASTE TOKEN HERE’를 토큰으로 교체하고 누른 후 Enter, 너는 될거야 automatically logged in 귀하의 Discord 계정에.

이메일 주소나 비밀번호를 입력할 필요가 없습니다.

2단계 인증을 완료하지 않아도 됩니다.

이제 개발자 도구를 닫고 Discord를 사용하세요!

결론

Discord 피싱 사기를 조심하세요!

누군가 귀하의 Discord 토큰을 공유해 달라고 요청하면 그렇게 하지 마십시오.

Discord 직원은 토큰을 요구하지 않습니다.

불행히도 많은 사용자가 토큰 사기의 희생양이 되었습니다.

당신이 그들 중 하나라면, 당신은 change your Discord password 즉시.

또한 Discord 지원에 문의하여 도움을 받을 수 있습니다.

JWT 토큰을 이용해서 로그인 인증 구현하기

회원의 로그인정보를 통한 authentication을 구현해보자.

Authentication

로그인 인증 구현 방식에는 session cookie 방식과 jwt 토큰 방식이 존재한다. session cookie 방식은 사용자에 따라서 고유의 session ID가 발급되며 유의미한 정보를 담고 있지 않기 때문에 쿠키방식보다는 안전하지만, 세션저장소에 모두 담아두기 때문에 다수의 요청이 발생시 부하가 발생할 수 있다.

JWT

세션쿠키와 하게 인증에 필요한 정보들을 암호화한 토큰을 사용하는 방식으로, 비밀키가 유출되지 않는 이상 토큰을 복호화 하지 못하므로 보안이 유리하다. access token의 기한은 유효하지만, access token이 만료되기전에 사용자가 로그인하면 refresh token을 이용해서 access token을 재발급하여 사용기한을 늘릴 수 있다. refresh token이 만료되면 재로그인 요청을 보낸다. 그러나, 이 또한 세션쿠키보다 길이가 길기 때문에 (.을 기준으로 세가지 부위로 나뉨) 인증요청이 많아질 수록 네트워크 부하가 심해질 수 있다.

출처 구글

Jwt는 토큰을 생성하는 부분과 , 들어온 토큰의 유효성을 검사하는 부분으로 나뉜다.

Generate Token

토큰을 생성할 때는 요청에 토큰이 있는지 확인하고 없다면, 유저의 로그인 정보(아이디, 패스워드)를 받아서 이를 이용해서 토큰을 생성해놓고 유효한 정보인지를 확인한 후에 유효한 로그인 정보일 경우에 생성한 토큰을 돌려준다.

Validate Token

유효성 검사는 토큰을 헤더로 받아서 토큰을 해부해서 유효한 로그인 정보인지를 검사한 후에, 토큰이 유효하다면 요청을 처리한다.

다음과 같이 pom.xml에 dependency를 추가해준다.

org.springframework.boot spring-boot-starter-security 2.3.9.RELEASE io.jsonwebtoken jjwt 0.9.1

토큰을 생성하기 위해서는 secret키를 사용해야한다. secret key는 토큰을 생성하고 유효성검사하는데에 아주 중요한 역할을 하게 된다.

application.properties에 따로 추가해준다.

jwt.secret=사용할 secret key 입력

유튜브 설명 동영상 캡쳐분 (알고리즘 선택기준에 따라서 secretkey 바이트가 달라진다)

JWT token util

이제 secret 키를 이용해서 토큰 생성, 유효성 검사, 유효기간 검사하는 코드를 작성해준다.

import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.function.Function; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; @Component public class JwtTokenUtil implements Serializable { private static final long serialVersionUID = -2550185165626007488L; public static final long JWT_TOKEN_VALIDITY = 5*24 * 60 * 60; //토큰의 기한 (5일로 설정) @Value(“${jwt.secret}”) private String secret; //retrieve username from jwt token(토큰으로부터 사용자 이름 가져오기) public String getUsernameFromToken(String token) { return getClaimFromToken(token, Claims::getSubject); } //retrieve expiration date from jwt token(토큰으로부터 유효기간 가져오기) public Date getExpirationDateFromToken(String token) { return getClaimFromToken(token, Claims::getExpiration); } public T getClaimFromToken(String token, Function claimsResolver) { final Claims claims = getAllClaimsFromToken(token); return claimsResolver.apply(claims); } //for retrieveing any information from token we will need the secret key(토큰에 저장된 모든정보 가져오기) private Claims getAllClaimsFromToken(String token) { return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); } //check if the token has expired (토큰의 유효기간 검사) private Boolean isTokenExpired(String token) { final Date expiration = getExpirationDateFromToken(token); return expiration.before(new Date()); } //generate token for user (토큰 생성) public String generateToken(String username) { Map claims = new HashMap<>(); return doGenerateToken(claims, username); } //while creating the token – (토큰에 정보를 넣고, 시크릿 키를 이용해서 토큰을 compact하게 만든다) //1. Define claims of the token, like Issuer, Expiration, Subject, and the ID //2. Sign the JWT using the HS512 algorithm and secret key. //3. According to JWS Compact Serialization(https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-3.1) // compaction of the JWT to a URL-safe string private String doGenerateToken(Map claims, String subject) { return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000)) .signWith(SignatureAlgorithm.HS512, secret).compact(); } //validate token (토큰의 유효여부를 검사한다) public Boolean validateToken(String token, UserDetails userDetails) { final String username = getUsernameFromToken(token); return (username.equals(userDetails.getUsername()) && !isTokenExpired(token)); } }

JWT user details

여기서 사용자의 이름과 패스워드를 정해준다. 사용자의 username이 아닌 email을 이용해서 유효검사를 진행하기 때문에 변견사항을 적용시켜주고, 사용자의 role에 따라서 권한여부가 달라지므로 authority도 부여해준다.

import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class JwtUserDetails implements UserDetails { private User user; public JwtUserDetails(User user) { super(); this.user = user; } @Override public Collection getAuthorities() { Role role = user.getRole(); List authorities = new ArrayList(); authorities.add(new SimpleGrantedAuthority(role.getName())); return authorities; } @Override public String getPassword() { return user.getPassword(); } @Override public String getUsername() { return user.getEmail(); } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } }

JWT user details service

작성한 user details를 이용해서 다음과 같이 적용시켜준다. 이메일을 이용해서 유저를 찾을 수 없다면 usernameNotFoundException을 던져준다.

import com.yunhalee.withEmployee.Repository.UserRepository; import com.yunhalee.withEmployee.entity.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class JwtUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepo; @Override @Transactional public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User entityUser = userRepo.findByEmail(username); if(entityUser != null) return new JwtUserDetails(entityUser); throw new UsernameNotFoundException(“Could not find user with email : ” + username); } }

JWT authentication controller

이제 “/authenticate”를 통해서 들어온 정보를 이용해서 토큰검사를 진행하는 컨트롤러를 작성해준다.

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.DisabledException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController @CrossOrigin public class JwtAuthenticaationController { @Autowired private AuthenticationManager authenticationManager; @Autowired private JwtTokenUtil jwtTokenUtil; @Autowired private JwtUserDetailsService userDetailsService; @PostMapping(“/authenticate”) public String createAuthenticationToken(@RequestBody JwtRequest authenticationRequest) throws Exception{ authenticate(authenticationRequest.getUsername(), authenticationRequest.getPassword()); final UserDetails userDetails = userDetailsService.loadUserByUsername(authenticationRequest.getUsername()); // final String token = jwtTokenUtil.generateToken(userDetails); return jwtTokenUtil.generateToken(authenticationRequest.getUsername()); } private void authenticate(String username, String password) throws Exception { try { Authentication authentication=authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); SecurityContextHolder.getContext().setAuthentication(authentication); System.out.println(authentication.getAuthorities().toString()); } catch (DisabledException e) { throw new Exception(“USER_DISABLED”, e); } catch (BadCredentialsException e) { throw new Exception(“INVALID_CREDENTIALS”, e); } } }

JWT request

우리가 입력받은 username, password정보를 저장해준다.

import java.io.Serializable; public class JwtRequest implements Serializable { private static final long serialVersionUID = 5926468583005150707L; private String username; private String password; //need default constructor for JSON Parsing public JwtRequest() { } public JwtRequest(String username, String password) { this.setUsername(username); this.setPassword(password); } public String getUsername() { return this.username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } }

JWT response

생성된 토큰을 돌려주는 코드를 작성해준다.

import java.io.Serializable; public class JwtResponse implements Serializable { private static final long serialVersionUID = -8091879091924046844L; private final String jwttoken; public JwtResponse(String jwttoken) { this.jwttoken = jwttoken; } public String getToken() { return this.jwttoken; } }

JWT request filter

들어온 요청의 토큰이 validate한지를 검사한다.

import io.jsonwebtoken.ExpiredJwtException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtRequestFilter extends OncePerRequestFilter { @Autowired private JwtUserDetailsService jwtUserDetailsService; @Autowired private JwtTokenUtil jwtTokenUtil; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { final String requestTokenHeader = request.getHeader(“Authorization”); String username = null; String jwtToken = null; // JWT Token is in the form “Bearer token”. Remove Bearer word and get // only the Token if (requestTokenHeader != null && requestTokenHeader.startsWith(“Bearer “)) { jwtToken = requestTokenHeader.substring(7); username = jwtTokenUtil.getUsernameFromToken(jwtToken); try { username = jwtTokenUtil.getUsernameFromToken(jwtToken); } catch (IllegalArgumentException e) { System.out.println(“Unable to get JWT Token”); } catch (ExpiredJwtException e) { System.out.println(“JWT Token has expired”); } } else { logger.warn(“JWT Token does not begin with Bearer String”); } // Once we get the token validate it. if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { UserDetails userDetails = jwtUserDetailsService.loadUserByUsername(username); // if token is valid configure Spring Security to manually set // authentication if (jwtTokenUtil.validateToken(jwtToken, userDetails)) { UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken( userDetails, null, userDetails.getAuthorities()); usernamePasswordAuthenticationToken .setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); // After setting the Authentication in the context, we specify // that the current user is authenticated. So it passes the // Spring Security Configurations successfully. SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); } } chain.doFilter(request, response); } }

JWT authentication entry point

인증되지 않은 토큰을 가진 요청은 401 에러를 발생시킬 것이다.

import java.io.IOException; import java.io.Serializable; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; @Component public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint, Serializable { private static final long serialVersionUID = -7858869558953243875L; @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authException.getMessage()); } }

Web Security Config

security config는 다음과 같이 작성한 코드들을 사용해서 구현해주도록 한다. (/authenticate는 따로 구현)

cors에러를 막기위해서 (403 error in post request) csrf().disabled()를 해줬다.

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity //@EnableGlobalMethodSecurity(prePostEnabled = true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; @Autowired private JwtRequestFilter jwtRequestFilter; @Autowired private JwtUserDetailsService jwtUserDetailsService; @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } @Bean public DaoAuthenticationProvider authenticationProvider(){ DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); authProvider.setUserDetailsService(jwtUserDetailsService); authProvider.setPasswordEncoder(passwordEncoder()); return authProvider; } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(authenticationProvider()); } @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception{ return super.authenticationManagerBean(); } @Override protected void configure(HttpSecurity http) throws Exception { //form형식의 데이터에서 cors오류 방지를 위해서 csrf disable시켜주었다. http.cors() .and() .csrf() .disable() .authorizeRequests() .antMatchers(“/user/{id}”, “/user/save”).hasAnyAuthority(“Member”, “Leader”, “Admin”,”CEO”) .anyRequest() .authenticated() .and() .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint) .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .formLogin() .disable(); http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); } @Override public void configure(WebSecurity web) throws Exception { //다음의 데이터는 seurity configur제한을 받지 않는다. (정적데이터는 접근가능하도록 설정) web.ignoring().antMatchers(“/profileUploads/**”,”/messageUploads/**”, “/js/**”,”/webjars/**”); } }

회원가입 구현

이제 토큰방식을 이용해서 회원가입을 진행하도록 하자. user controller에서는 다음과 같이 회원가입 정보를 받아서 서비스로 넘겨준다.

register하기전에 check_email을 통해서 unique 한지 검사도 진행해준다.

@PostMapping(“/user/register”) public ResponseEntity register(@RequestParam(“name”)String name, @RequestParam(“email”)String email, @RequestParam(“password”)String password, @RequestParam(“description”)String description, @RequestParam(“phoneNumber”)String phoneNumber, @RequestParam(“role”)String role) throws IOException { UserDTO userDTO = new UserDTO(name, email, password, description, phoneNumber, role); savedUserDTO.setPassword(“”); return new ResponseEntity(savedUserDTO, HttpStatus.OK); } @PostMapping(“/user/check_email”) public String checkDuplicateEmail(@Param(“id”) Integer id, @Param(“email”) String email){ return service.isEmailUnique(id, email)? “OK” : “Duplicated”; }

user service에서는 bcrypt 패스워드 인코더를 사용해서 인코딩된 패스워드를 db에 저장해주도록 한다. (security config에서 password 인코더를 bcryptPasswordEncoder로 정의해주었다)

@Autowired private PasswordEncoder passwordEncoder; public UserDTO save(UserDTO userDTO, MultipartFile multipartFile) throws IOException { User user = new User(); userDTO.setId(user.getId()); user.setName(userDTO.getName()); user.setEmail(userDTO.getEmail()); user.setPassword(passwordEncoder.encode(userDTO.getPassword())); user.setDescription(userDTO.getDescription()); if(userDTO.getRole()!=null){ Role role = roleRepository.findByName(“CEO”); user.setRole(role); }else{ Role role = roleRepository.findByName(“Member”); user.setRole(role); } repo.save(user); repo.save(user); return new UserDTO(user); } }

로그인 구현

이번엔 들어온 정보를 통해서 로그인을 구현해보자. 들어온 정보가 올바른지 확인하고 로그인해준다. usercontroller에 다음과 같이 작성해준다. (예외 발생)

@PostMapping(“/user/login”) public ResponseEntity login(@RequestBody Map body) throws IllegalAccessException { String email = body.get(“username”); String password = body.get(“password”); System.out.println(email); System.out.println(password); UserDTO user = service.getByEmail(email); if(!passwordEncoder.matches( password ,user.getPassword())){ throw new IllegalAccessException(“Wrong Password”); } user.setPassword(“”); return new ResponseEntity(user, HttpStatus.OK); }

userservice를 다음과 같이 save함수를 변경해준다.

public UserDTO save(UserDTO userDTO, MultipartFile multipartFile) throws IOException { if(userDTO.getId()!=null){ User existingUser = repo.findById(userDTO.getId()).get(); existingUser.setName(userDTO.getName()); if(userDTO.getPassword()!=null){ existingUser.setPassword(userDTO.getPassword()); } existingUser.setDescription(userDTO.getDescription()); repo.save(existingUser); return new UserDTO(existingUser); }else{ User user = new User(); userDTO.setId(user.getId()); user.setName(userDTO.getName()); user.setEmail(userDTO.getEmail()); user.setPassword(passwordEncoder.encode(userDTO.getPassword())); user.setDescription(userDTO.getDescription()); if(userDTO.getRole()!=null){ Role role = roleRepository.findByName(“CEO”); user.setRole(role); }else{ Role role = roleRepository.findByName(“Member”); user.setRole(role); } repo.save(user); repo.save(user); return new UserDTO(user); } }

Client

클라이언트에서 요청을 보낼 때에는 다음과 같이 header 로 토큰을 넣어주면 된다.

const res = await axios.get(`/messages/${id}`,{ headers : {Authorization : `Bearer ${token}`} })

JSON Web Token] 로그인

Introduction

웹 / 앱 개발을 하면 로그인 과정에서 반드시 만나게 되는 개념이 쿠키-세션 이다.

이미 많은 자료와 경험으로 인해 쿠키는 나쁜 놈 세션은 좋은 놈 , 로그인은 일단 세션으로 해야지라는 개념이 개발자들의 머릿속에 자리 잡혀있다.

그러나, 최근 들어 IT 인프라 구성에 많은 변화가 생겼다. 웹 기반의 서비스들은 웹과 앱을 함께 서비스하는 것을 넘어 ‘Mobile First’ 앱이 먼저라는 인식까지 생겨났다.

또한, AWS, Azure 와 같은 IaaS 클라우드 서비스가 대중화 되면서 고사양 단일 서버 아키텍쳐에서 중-저사양 다중 서버 아키텍쳐로 변화하고 있다.

이러한 상황에서 더 이상 쿠키-세션 기반 인증 아키텍쳐는 현재의 요구사항을 만족하지 못하고 있다.

현재의 요구 사항을 그나마 충족시키는 Web Token 기반 JWT 에 대해서 알아보고 Web Token 이 나타난 배경과 장단점에 대해서 알아보겠다.

Part 1. JWT’s Basic Information

JSON Web Token

JSON 포맷을 이용한 Web Token

Claim based Token

두 개체에서 JSON 객체를 이용해 Self-contained 방식으로 정보를 안전한게 전달

회원 인증, 정보 전달에 주로 사용

RFC 7519

Claim based ?

Claim : 사용자에 대한 프로퍼티 / 속성

: 사용자에 대한 프로퍼티 / 속성 토큰 자체가 정보

Self-contained : 자체 포함, 즉 토큰 자체가 정보

: 자체 포함, 즉 토큰 자체가 정보 key / value

Part 2. Web Token

웹 토큰의 필요성

CSRF, 기존 시스템의 보안 문제

CORS, 도메인 확장시 api로서의 문제

Web, Mobile 등 다양한 클라이언트

Session 의 한계

Scale out 의 한계

REST API : REST API는 Stateless를 지향

현재 우리는?

그런데 아직도 Cookie??

쿠키 기반 로그인의 문제점은 너무 많다

Server side Session 기반으로 넘어갈 것인가?

쿠키 기반 인증은 두말 할것 없이 변경해야 하고, 보편적 Session으로 갈것인가?

Part 3. Type of Authorization

Cookie – Client Side Storage

문제점 투성이

Session – Sever Side Authorization

Cookie와 차이점은 Cookie는 정보를 클라이언트에 저장하고 Session은 정보를 서버에 저장한다.

Session Problem 1 – 서버 확장시 세션 정보의 동기화 문제

서버가 스케일아웃 돼서 여러 개가 생기면 각 서버마다 세션 정보가 저장된다.

로그인시(서버1), 새로고침(서버2) 로 접근하면 서버는 인증이 안됐다고 판단한다.

Session Problem 2 – 서버 / 세션 저장소의 부하

세션을 각 서버에 저장하지 않고 세션 전용 서버, DB에 저장해도 문제가 생긴다.

모든 요청 시 해당 서버에 조회해야 한다. DB 부하를 야기할 수 있다.

Session Problem 3 – 웹 / 앱 간의 상이한 쿠키-세션 처리 로직

기존의 Client는 웹 브라우저가 유일했다. 그러나 이제는 모바일로 접근하는 경우도 처리해야 한다.

웹 / 앱 의 쿠키 처리 방법이 다르고 또 다른 Client 가 생겨나면 쿠키-세션에 맞게 처리해야 한다.

Token – Self-contained & Stateless

앞의 문제를 해결하는 최선의 방법은 토큰이다.

토큰은 서버의 상태를 저장하지 않는다. 토큰 자체로 정보를 가지고 있기 때문에 별도의 인증서버가 필요없다. 따라서 요청을 받을 서버 자체에서 인증 프로세스를 수행할 수 있다.

또한, JSON 포맷으로 통신하기 때문에 어떤 Client 에서든 Data 통신에 JSON을 이용하면 토큰을 이용할 수 있다.

Part 4. JWT’s Architecture

JWT의 기본 구조

Header . Payload . Signature

Header

JWT 웹 토큰의 헤더 정보

typ : 토큰의 타입, JWT만 존재

: 토큰의 타입, JWT만 존재 alg : 해싱 알고리즘. (HMAC SHA256 or RSA). 헤더를 암호화 하는게 아니다. 토큰 검증시 사용.

{

” alg ” : “HS256″ ,

” typ ” : “JWT”

}

위의 내용을 base64 로 인코딩한다. => eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

base 64 는 암호화된 문자열이 아니다. 같은 문자열에 대해서는 항상 같은 인코딩 문자열을 반환한다.

Payload

실제 토큰으로 사용하려는 데이터가 담기는 부분. 각 데이터를 Claim이라고 하며 다음과 같이 3가지 종류가 있다.

Reserved claims : 이미 예약된 Claim. 필수는 아니지만 사용하길 권장. key 는 모두 3자리 String이다.

iss (String) : issuer, 토큰 발행자 정보 exp (Number) : expiration time, 만료일 sub (String) : subject, 제목 aud (String) : audience, More

: 이미 예약된 Claim. 필수는 아니지만 사용하길 권장. key 는 모두 3자리 String이다. Public claims : 사용자 정의 Claim.

Public 이라는 이름처럼 공개용 정보 충돌 방지를 위해 URI 포맷을 이용해 저장한다.

: 사용자 정의 Claim. Private claims : 사용자 정의 Claim Public claims 과 다르게 사용자가 임의로 정한 정보 아래와 같이 일반 정보를 저장한다.

{

” name ” : “hak” ,

” age ” : 26 ,

}

Signature

Header와 Payload의 데이터 무결성과 변조 방지를 위한 서명

Header + Payload 를 합친 후, Secret 키와 함께 Header의 해싱 알고리즘으로 인코딩

HMACSHA256( base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)

JWT 구조

JWT는 [Header Payload Signature] 각각 JSON 형태의 데이터를 base 64 인코딩 후 합친다.

아래와 같은 순서로 . 을 이용해 합친다.

최종적으로 만들어진 토큰은 HTTP 통신 간 이용되며, Authorization 이라는 key 의 value 로서 사용된다.

JWT 인증 과정

Part 5. Is JWT a Silver bullet?

그렇다면 모든 서비스들은 기존의 쿠키-세션 기반에서 웹 토큰 기반의 인증으로 변경해야할까?

JWT 의 단점 & 도입시 고려사항

Self-contained : 토큰 자체에 정보가 있다는 사실은 양날의 검이 될수 있다. 토큰 길이 : 토큰 자체 payload 에 Claim set을 저장하기 때문에 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다. payload 암호화 : payload 자체는 암호화 되지 않고 base64로 인코딩한 데이터다.

중간에 payload를 탈취하면 디코딩을 통해 테이터를 볼 수 있다.

JWE 를 통해 암호하하거나, payload에 중요 데이터를 넣지 않아야 한다.

Stateless : 무상태성이 때론 불편할 수 있다. 토큰은 한번 만들면 서버에서 제어가 불가능하다.

토큰을 임의로 삭제할 수 있는 방법이 없기 때문에 토큰 만료시간을 꼭 넣어주는게 좋다.

tore Token : 토큰은 클라이언트 side에서 관리해야하기 때문에 토큰을 저장해야한다.

Conclusion

HTTP, REST API 의 공통적인 특징은 Stateless (무상태)를 지향한다는 것이다.

Stateful , 즉 상태를 저장하는 서버는 많은 Side-effect를 발생시킬 수 있다.

또한, 서론에 말했듯이 현재의 IT 인프라 구조는 유연한 확장 가능성이 있어야 하는데 기존의 쿠키-세션 기반의 인증을 사용하면 확장 가능한 인프라를 구성하기 힘들다.

기존의 로그인 / 인증을 모두 Web Token 기반으로 변경할 수는 없지만, 앞으로 만들게 될 서비스 특히 RESTful한 API의 인증에는 JWT를 사용해보는 것이 좋을 것이라 생각한다.

( JWT 인증 예제 – https://github.com/SangHakLee/nodejs-jwt-example-ryan).

References

인가]Session(세션)과 Token(토큰)(JWT)의 차이점

바로 직전의 통신도 기억 못하는 HTTP

HTTP는 stateless한 특성을 가지기 때문에 각 통신의 상태는 저장되지 않습니다.

하지만 우리가 웹 서비스를 사용할 때를 생각해봅시다.

매번 새 페이지를 요청할때마다 로그인을 해야 한다면 사용이 불가능할 것입니다.

기억하는 척 하기 위해 사용되는 세션과 토큰

이 문제를 해결하기 위한 대표적인 도구 두 가지가 바로 세션(Session)과 토큰(Token)입니다.

유저가 로그인을 시도할 때 서버상에서 일치하는 유저 정보를 찾았다면

인증(Authentication) 확인의 표시로 세션이나 토큰을 발급/전달해줍니다.

그럼 웹 브라우저 측에서 해당 세션/토큰 정보를 받아 간직하고 있다가

새로운 request를 보낼 때마다 인가(Authorization)를 위해 해당 세션/토큰을 함께 보냅니다.

그런데 세션과 토큰 모두 존재 목적은 거의 같지만 차이점은 존재합니다.

그 중 가장 큰 차이점은 세션은 데이터베이스 서버에 저장된다는 것,

토큰은 클라이언트 측에서만 저장한다는 점입니다.

차이점 1. 사이즈

세션 < 토큰 세션을 사용시 주고받는 session id의 크기는 매우 작습니다. 반면 (JWT기준) 토큰은 같은 데이터를 담고 있어도 그에 비해 크기가 큽니다. 사실 이 차이점을 신경쓰고 쓰는 사람은 많지 않은 것 같습니다만.. 출처: https://developer.okta.com/blog/2017/08/17/why-jwts-suck-as-session-tokens 차이점 2. 안전성 세션 세션은 서버측에서 저장/관리하기 때문에 상대적으로 온전한 상태를 유지하기 유리합니다. 하지만 여전히 공격의 위험이 있기에 유효기간, HttpOnly, Secure 옵션 등을 주어 쿠키에 저장합니다. 토큰 반대로 토큰은 웹 브라우저측 (local storage, 혹은 쿠키 등)에 저장되기 때문에 공격에 노출될 가능성이 더 큽니다. 이런 경우를 대비해 토큰에는 민감한 정보를 담지 않습니다. 그리고 유효기간을 짧게 설정해 공격에 노출될 수 있는 시간을 최소화합니다. 하지만 짧은 주기로 토큰이 무효화되면 서비스 사용자는 계속 로그인을 해줘야 하는 번거로움이 있기 때문에 애초에 로그인(인증)시 refresh token이라는 것을 추가적으로 발급합니다. refresh token은 좀 더 긴 유효기간을 가졌으며 최대한 안전한 곳에 저장됩니다. 기존의 토큰이 만료되거나 변질되면 refresh token을 통해 토큰을 재발급합니다. 차이점 3. 확장성 최근 대부분의 웹 서비스가 토큰 방식을 선택하게 된 이유가 바로 확장성에 있습니다. 세션은 서버에 저장되기 때문에 한꺼번에 다중 접속자가 발생한다면 과부하가 걸릴 수 있습니다. 그럼 과부하를 덜어주기 위해 서버를 여러 대를 두면 되겠죠? 하지만 또 서버가 여러대라면 세션을 쓰기가 복잡해집니다. 서버 분산 / 클러스터 환경에서 드러나는 결정적인 차이 요즘 많은 서비스들은 서버 과부하 부담을 줄이기 위해 여러 서버를 두고 서비스를 운영합니다. 그리고 앞서 언급했듯 HTTP는 stateless, connectionless 하기 때문에 request마다 내가 접속한 서버가 달라질 수도 있습니다!! 이렇게 되어 버리면 session 정보가 없는 다른 서버에 접속할 때마다 계속 로그인해줘야 합니다. 서버 분산 환경에서는 로드 밸런서가 각 request에 대한 서버를 지정해준다. 물론 이러한 세션의 단점을 해결하기 위해 sticky session, session clustering과 같은 방안이 나오기도 했습니다만 또 이 방안들도 감안해야 할 처리 비용이 발생하기 때문에* 애초에 이런 걱정 없이 쓸 수 있는 토큰이 인기가 많은 게 아닌가 싶습니다. * sticky session은 처음 지정받은 서버만 사용할 수 있기 때문에 해당 서버가 터지거나 과부하가 걸려도 어찌할 도리가 없습니다. session clustering은 모든 서버마다 세션을 복사해줘야 하기 때문에 상당한 메모리를 요구할 뿐 아니라 매 로그인마다 오버헤드가 크게 발생합니다. 물론 세션용 서버를 따로 두고 쓰는 방법도 있습니다. 하지만 만일을 대비하여 서버를 복제해두어야 합니다. 애초에 토큰방식을 사용한다면 추가 서버 없이 인증/인가를 처리할 수 있습니다. 한 눈에 보는 세션, 토큰 동작방식 세션 토큰 출처 smjeon.dev/web/sticky-session/ developer.okta.com/blog/2017/08/17/why-jwts-suck-as-session-tokens dooopark.tistory.com/6 velog.io/@hyeminn/%EB%8B%A4%EC%A4%91-%EC%84%9C%EB%B2%84-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EC%84%B8%EC%85%98%EC%9D%84-%EA%B4%80%EB%A6%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95 swalloow.github.io/implement-jwt/

Kakao Developers REST API

REST API

이 문서는 REST API를 사용한 로그인 구현 방법을 안내합니다.

이 문서에 포함된 기능 일부는 [도구] > [REST API 테스트]를 통해 사용해 볼 수 있습니다.

REST API 테스트 도구outlink

카카오 로그인 구현에 필요한 로그인 버튼 이미지는 [도구] > [리소스 다운로드]에서 제공합니다. 해당 로그인 버튼은 디자인 가이드를 참고하여 서비스 UI에 적합한 크기로 수정하여 사용할 수 있습니다.

리소스 다운로드outlink 디자인 가이드

시작하기 전에

REST API를 사용한 카카오 로그인은 PC 및 모바일 웹에서 카카오 로그인 구현 시 적합한 방식입니다. 다음은 REST API를 사용한 카카오 로그인 과정을 나타낸 시퀀스 다이어그램입니다. 단계별 안내를 함께 참고합니다.

Step 1.

서비스 서버가 카카오 인증 서버로 인가 코드 받기를 요청합니다. JavaScript SDK를 사용할 경우, Kakao.Auth.authorize() 함수를 사용합니다. 카카오 인증 서버가 사용자에게 카카오계정 로그인을 통한 인증을 요청합니다. 클라이언트에 유효한 카카오계정 세션이 있거나, 카카오톡 인앱 브라우저에서의 요청인 경우 4단계로 넘어갑니다. 사용자가 카카오계정으로 로그인합니다. 카카오 인증 서버가 사용자에게 동의 화면을 출력하여 인가를 위한 사용자 동의를 요청합니다. 동의 화면은 서비스 앱의 동의 항목 설정에 따라 구성됩니다. 사용자가 필수 동의 항목, 이 외 원하는 동의 항목에 동의한 뒤 [동의하고 시작하기] 버튼을 누릅니다. 카카오 인증 서버는 서비스 앱의 Redirect URI로 인가 코드를 전달합니다. 카카오계정 세션 클라이언트에서 사용자가 이미 카카오계정으로 로그인한 상태라면 카카오계정 세션이 존재합니다. 로그인 시 카카오계정 세션의 인증 시간은 기본 24시간이며, 최초 인증 후 세션 시간은 변경되지 않습니다. 사용자가 카카오계정 로그인 화면에서 [로그인 상태 유지]를 선택한 경우에는 인증 시간이 1달입니다. 간편 로그인 모바일 웹 환경에서는 사용자가 카카오계정 ID와 비밀번호를 입력하지 않고도 카카오톡을 통해 인증을 받아 간편하게 로그인할 수 있는 간편 로그인을 사용할 수 있습니다.

Step 2.

서비스 서버가 Redirect URI를 통해 전달받은 인가 코드로 토큰 받기를 요청합니다. 카카오 인증 서버가 토큰을 발급하여 서비스 서버에 전달합니다. 토큰은 액세스 토큰(Access token), 리프레시 토큰(Refresh token), ID 토큰(ID token) 세 종류입니다.

토큰은 동의 화면을 통해 사용자 동의를 받은 인가 정보를 포함합니다.

ID 토큰은 OpenID Connect 사용 시에만 발급됩니다.

Step 3.

주의 서비스의 사용자 로그인 처리는 서비스에서 자체 구현해야 합니다. 이 문서는 사용자 로그인 처리 구현 시 참고할 수 있는 정보를 제공합니다. 서비스 서버가 발급받은 액세스 토큰으로 사용자 정보 가져오기를 요청해 사용자의 회원번호 및 정보를 조회하여 서비스 회원인지 확인합니다.

서비스 회원 확인 결과에 따라 서비스 로그인 또는 회원 가입 과정을 진행합니다.

이 외 서비스에서 필요한 로그인 절차를 수행한 후, 카카오 로그인한 사용자의 서비스 로그인 처리를 완료합니다.

인가 코드 받기

기본 정보

인가 코드 받기는 카카오 로그인을 시작하는 단계로써 카카오 로그인 동의 화면을 호출하고, 사용자 동의를 거쳐 인가 코드 발급을 요청합니다. 인가 코드는 토큰 받기에 필요한 값으로, 토큰에 부여될 권한 정보를 포함합니다. OpenID Connect를 사용하는 앱일 경우, 앱 설정에 따라 ID 토큰 발급을 함께 발급받을 수 있는 인가 코드를 요청합니다.

인가 코드 받기 요청은 웹 브라우저 또는 웹뷰의 카카오계정 세션 존재 여부에 따라 다르게 동작합니다.

카카오계정 세션 없음: 사용자가 카카오계정 정보를 입력하거나 카카오톡으로 로그인하는 인증 과정을 거쳐 동의 화면을 출력합니다.

카카오계정 세션 있음: 카카오계정 로그인 과정을 거치지 않고 바로 동의 화면을 출력합니다.

사용자는 동의 화면에서 서비스 이용 시 필요한 사용자 정보 및 권한 제공에 동의하고 로그인을 요청하거나 로그인을 취소할 수 있습니다. 사용자가 필수 동의 항목에 모두 동의한 뒤 [동의하고 계속하기] 버튼을 누르면, 카카오 인증 서버는 해당 사용자에 대한 인가 코드를 발급해 서비스의 redirect_uri 에 전달합니다.

동의 화면 동의 화면은 사용자와 앱이 연결되는 시점에 나타나므로, 최초 연결 시에만 동의 화면이 나타납니다. 사용자가 이미 동의 화면에 동의를 완료한 경우에는 동의 화면이 나타나지 않고 즉시 인가 코드가 발급됩니다. 동의 화면을 다시 띄우려면 연결 끊기 후 다시 인가 코드 받기를 요청합니다.

인가 코드 요청의 응답은 redirect_uri 로 HTTP 302 Redirect되며, Location 에 인가 코드가 담긴 쿼리 스트링(Query String) 또는 에러 정보를 포함합니다. 사용자가 [취소] 버튼을 클릭한 경우에는 에러 메시지를 담은 쿼리 스트링이 redirect_uri 로 전송됩니다.

서비스 서버는 redirect_uri 로 받은 요청을 처리해 인가 코드를 얻거나 상황에 맞는 페이지를 보여주도록 처리해야 합니다. 받은 인가 코드는 토큰 받기에 사용합니다. 에러 응답을 받은 경우, 문제 해결과 REST API 레퍼런스에서 원인을 확인합니다.

주의: Invalid redirect Invalid redirect 에러는 인가 코드 발급 요청 시 전달된 redirect_uri와 앱 정보에 등록된 값이 일치하지 않을 때 발생합니다. 문제 해결에서 원인을 파악합니다.

참고: 보안을 위한 파라미터

카카오 로그인은 OAuth 2.0 및 OpenID Connect 표준에 따라 보안을 위한 파라미터인 state , nonce 파라미터를 제공합니다. 사용자가 안전하게 카카오 로그인을 완료할 수 있도록 해당 파라미터 사용을 권장합니다.

Request

URL

GET /oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code HTTP/1.1 Host: kauth.kakao.com

Parameter

Name Type Description Required client_id String 앱 REST API 키

[내 애플리케이션] > [앱 키]에서 확인 가능 O redirect_uri String 인가 코드가 리다이렉트될 URI O response_type String code 로 고정 O state String 카카오 로그인 과정 중 동일한 값을 유지하는 임의의 문자열(정해진 형식 없음)

Cross-Site Request Forgery(CSRF) 공격으로부터 카카오 로그인 요청을 보호하기 위해 사용

각 사용자의 로그인 요청에 대한 state 값은 고유해야 함

인가 코드 요청, 인가 코드 응답, 토큰 발급 요청의 state 값 일치 여부로 요청 및 응답 유효성 확인 가능 X prompt String 동의 화면 요청 시 추가 상호작용을 요청하고자 할 때 전달하는 파라미터

쉼표(,)로 구분된 문자열 값 목록으로 전달

다음 값 사용 가능:

login : 기존 사용자 인증 여부와 상관없이 사용자에게 카카오계정 로그인 화면을 출력하여 다시 사용자 인증을 수행하고자 할 때 사용, 카카오톡 인앱 브라우저에서는 이 기능이 제공되지 않음

none : 사용자에게 동의 화면과 같은 대화형 UI를 노출하지 않고 인가 코드 발급을 요청할 때 사용, 인가 코드 발급을 위해 사용자의 동작이 필요한 경우 에러 응답 전달 X nonce String OpenID Connect를 통해 ID 토큰을 함께 발급받을 경우, ID 토큰 재생 공격을 방지하기 위해 사용

ID 토큰 유효성 검증 시 대조할 임의의 문자열(정해진 형식 없음) X

* auth_type: Deprecated, prompt를 사용하도록 변경

Response

Name Type Description Required code String 토큰 받기 요청에 필요한 인가 코드 X state String 요청 시 전달한 state 값과 동일한 값 X error String 인증 실패 시 반환되는 에러 코드 X error_description String 인증 실패 시 반환되는 에러 메시지 X

Sample

Request

https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}

Request: OpenID Connect를 통한 ID 발급 요청, nonce 파라미터 포함

https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&nonce=${NONCE}

Request: prompt=none 파라미터 전달

https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&prompt=none

Response: 사용자가 [동의하고 계속하기] 선택, 로그인 진행

HTTP/1.1 302 Found Content-Length: 0 Location: ${REDIRECT_URI}?code=${AUTHORIZE_CODE}

Response: prompt=none 파라미터 전달, 사용자 동의가 필요해 에러 응답

HTTP/1.1 302 Found Content-Length: 0 Location: ${REDIRECT_URI}?error=consent_required&error_description=user%20consent%20required.

Response: 로그인 취소

HTTP/1.1 302 Found Content-Length: 0 Location: ${REDIRECT_URI}?error=access_denied&error_description=User%20denied%20access

토큰 받기

기본 정보

인가 코드로 토큰 발급을 요청합니다. 인가 코드 받기만으로는 카카오 로그인이 완료되지 않으며, 토큰 받기까지 마쳐야 카카오 로그인을 정상적으로 완료할 수 있습니다.

필수 파라미터를 포함하여 POST 로 요청합니다. 요청 성공 시 액세스 토큰, 리프레시 토큰과 토큰 정보를 포함한 JSON 객체를 받습니다. OpenID Connect를 사용하는 앱인 경우, 응답에 ID 토큰이 함께 포함됩니다.

토큰 받기를 통해 발급받은 액세스 토큰은 사용자 정보 가져오기와 같은 카카오 로그인이 필요한 API를 호출할 때 사용합니다. 토큰 받기에 성공하여 카카오 로그인을 완료했다면, 사용자 정보 요청을 통해 필요한 사용자 정보를 받아 서비스 회원 가입 및 로그인 등을 처리합니다.

각 토큰의 역할과 만료 시간에 대한 자세한 정보는 토큰 정보에서 확인할 수 있습니다. 액세스 토큰의 경우, 토큰 정보 보기로 토큰 유효성을 검사하거나 리프레시 토큰을 사용해 갱신할 수 있습니다.

Request

URL

POST /oauth/token HTTP/1.1 Host: kauth.kakao.com Content-type: application/x-www-form-urlencoded;charset=utf-8

Parameter

Name Type Description Required grant_type String authorization_code 로 고정 O client_id String 앱 REST API 키

[내 애플리케이션] > [앱 키]에서 확인 가능 O redirect_uri String 인가 코드가 리다이렉트된 URI O code String 인가 코드 받기 요청으로 얻은 인가 코드 O client_secret String 토큰 발급 시, 보안을 강화하기 위해 추가 확인하는 코드

[내 애플리케이션] > [보안]에서 설정 가능

ON 상태인 경우 필수 설정해야 함 X

Response

Name Type Description Required token_type String 토큰 타입, bearer 로 고정 O access_token String 사용자 액세스 토큰 값 O id_token String ID 토큰 값

OpenID Connect 확장 기능을 통해 발급되는 ID 토큰, Base64 인코딩 된 사용자 인증 정보 포함

제공 조건: OpenID Connect가 활성화 된 앱의 토큰 발급 요청인 경우

또는 scope 에 openid 를 포함한 추가 항목 동의 받기 요청을 거친 토큰 발급 요청인 경우 X expires_in Integer 액세스 토큰과 ID 토큰의 만료 시간(초)

참고: 액세스 토큰과 ID 토큰의 만료 시간은 동일 O refresh_token String 사용자 리프레시 토큰 값 O refresh_token_expires_in Integer 리프레시 토큰 만료 시간(초) O scope String 인증된 사용자의 정보 조회 권한 범위

범위가 여러 개일 경우, 공백으로 구분

참고: OpenID Connect가 활성화된 앱의 토큰 발급 요청인 경우, ID 토큰이 함께 발급되며 scope 값에 openid 포함 X

참고: ID 토큰 페이로드

Name Type Description Required iss String ID 토큰을 발급한 인증 기관 정보

https://kauth.kakao.com 로 고정 O aud String ID 토큰이 발급된 앱의 앱 키

인가 코드 받기 요청 시 client_id 에 전달된 앱 키

Kakao SDK를 통한 카카오 로그인의 경우, 해당 SDK 초기화 시 사용된 앱 키 O sub String ID 토큰에 해당하는 사용자의 회원번호 O iat Integer ID 토큰 발급 또는 갱신 시각, UNIX 타임스탬프(Timestamp) O exp Integer ID 토큰 만료 시간, UNIX 타임스탬프(Timestamp) O auth_time Integer 사용자가 카카오 로그인을 통해 인증을 완료한 시각, UNIX 타임스탬프(Timestamp) O nonce String 인가 코드 받기 요청 시 전달한 nonce 값과 동일한 값

ID 토큰 유효성 검증 시 사용 X

Sample

Request

curl -v -X POST “https://kauth.kakao.com/oauth/token” \ -H “Content-Type: application/x-www-form-urlencoded” \ -d “grant_type=authorization_code” \ -d “client_id=${REST_API_KEY}” \ –data-urlencode “redirect_uri=${REDIRECT_URI}” \ -d “code=${AUTHORIZE_CODE}”

Response: 성공

HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 { “token_type”:”bearer”, “access_token”:”${ACCESS_TOKEN}”, “expires_in”:43199, “refresh_token”:”${REFRESH_TOKEN}”, “refresh_token_expires_in”:25184000, “scope”:”account_email profile” }

Response: 성공, OpenID Connect를 활성화한 앱, ID 토큰 포함

HTTP/1.1 200 OK { “token_type”: “bearer”, “access_token”: “${ACCESS_TOKEN}”, “id_token”: “${ID_TOKEN}”, “expires_in”: 7199, “refresh_token”: “${REFRESH_TOKEN}”, “refresh_token_expires_in”: 86399, “scope”: “profile_image openid profile_nickname” }

토큰 정보 보기

기본 정보

액세스 토큰의 유효성을 검증하거나 정보를 확인합니다. 토큰 만료 여부나 유효기간을 알 수 있어 갱신 과정에 활용할 수 있습니다. 액세스 토큰을 요청 헤더(Header)에 담아 GET 으로 요청합니다.

응답은 JSON 객체로 토큰 상세 정보를 받습니다. 에러 발생 시 응답 코드 및 다음 내용을 참고합니다.

Code Description HTTP Status -1 카카오 플랫폼 서비스의 일시적 내부 장애 상태

토큰을 강제 만료(폐기) 또는 로그아웃 처리하지 않고 일시적인 장애 메시지로 처리 권장 400 -2 필수 인자가 포함되지 않은 경우나 호출 인자값의 데이터 타입이 적절하지 않거나 허용된 범위를 벗어난 경우

요청 시 주어진 액세스 토큰 정보가 잘못된 형식인 경우로 올바른 형식으로 요청했는지 확인 400 -401 유효하지 않은 앱키나 액세스 토큰으로 요청한 경우

토큰 값이 잘못되었거나 만료되어 유효하지 않은 경우로 토큰 갱신 필요 401

이 외 에러는 앱이나 사용자, 토큰 등의 상태가 더 이상 유효하지 않아 쓸 수 없는 경우로 로그아웃 처리를 권장합니다.

Request

URL

GET /v1/user/access_token_info HTTP/1.1 Host: kapi.kakao.com Authorization: Bearer ${ACCESS_TOKEN}

Header

Name Description Required Authorization 사용자 인증 수단, 액세스 토큰 값

Authorization: Bearer ${ACCESS_TOKEN} O

Response

Name Type Description Required id Long 회원번호 O expires_in Integer 액세스 토큰 만료 시간(초) O app_id Integer 토큰이 발급된 앱 ID O

* appId: Deprecated, app_id를 사용하도록 변경

* expiresInMillis: Deprecated, expires_in을 사용하도록 변경

Sample

Request

curl -v -X GET “https://kapi.kakao.com/v1/user/access_token_info” \ -H “Authorization: Bearer ${ACCESS_TOKEN}”

Response

HTTP/1.1 200 OK { “id”:123456789, “expires_in”: 7199, “app_id”:1234 }

토큰 갱신하기

기본 정보

액세스 토큰과 리프레시 토큰을 갱신합니다. JavaScript SDK 사용 시에도 보안 정책으로 인해 REST API로 액세스 토큰을 갱신합니다. 리프레시 토큰 값과 필수 파라미터를 담아 POST 로 요청합니다.

응답은 토큰 받기와 마찬가지로 JSON 객체로 전달됩니다. 응답 중 refresh_token 값은 요청 시 사용된 리프레시 토큰의 만료 시간이 1개월 미만으로 남았을 때만 갱신되어 전달됩니다. 따라서 refresh_token 과 refresh_token_expires_in 은 결과 값에 포함되지 않을 수 있다는 점을 응답 처리 시 유의해야 합니다.

참고: ID 토큰 갱신

OpenID Connect를 통해 ID 토큰과 함께 발급된 리프레시 토큰으로 토큰 갱신을 요청한 경우, 액세스 토큰과 ID 토큰이 함께 갱신되어 응답에 포함됩니다. OpenID Connect를 사용하지 않는 앱의 토큰 갱신 시에는 ID 토큰이 응답에 포함되지 않습니다.

Request

URL

POST /oauth/token HTTP/1.1 Host: kauth.kakao.com Content-type: application/x-www-form-urlencoded;charset=utf-8

Parameter

Name Type Description Required grant_type String refresh_token 으로 고정 O client_id String 앱 REST API 키

[내 애플리케이션] > [앱 키]에서 확인 가능 O refresh_token String 토큰 발급 시 응답으로 받은 refresh_token

Access Token을 갱신하기 위해 사용 O client_secret String 토큰 발급 시, 보안을 강화하기 위해 추가 확인하는 코드

[내 애플리케이션] > [보안]에서 설정 가능

ON 상태인 경우 필수 설정해야 함 X

Response

Name Type Description Required token_type String 토큰 타입, bearer 로 고정 O access_token String 갱신된 사용자 액세스 토큰 값 O id_token String 갱신된 ID 토큰 값

제공 조건: ID 토큰과 함께 발급된 리프레시 토큰으로 토큰 갱신을 요청한 경우 X expires_in Integer 액세스 토큰 만료 시간(초) O refresh_token String 갱신된 사용자 리프레시 토큰 값, 기존 리프레시 토큰의 유효기간이 1개월 미만인 경우에만 갱신 X refresh_token_expires_in Integer 리프레시 토큰 만료 시간(초) X

Sample

Request

curl -v -X POST “https://kauth.kakao.com/oauth/token” \ -H “Content-Type: application/x-www-form-urlencoded” \ -d “grant_type=refresh_token” \ -d “client_id=${REST_API_KEY}” \ -d “refresh_token=${USER_REFRESH_TOKEN}”

Response

HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 { “access_token”:”${ACCESS_TOKEN}”, “token_type”:”bearer”, “refresh_token”:”${REFRESH_TOKEN}”, //optional “refresh_token_expires_in”:25184000, //optional “expires_in”:43199, }

로그아웃

기본 정보

사용자 액세스 토큰과 리프레시 토큰을 모두 만료시킵니다. 사용자가 서비스에서 로그아웃할 때 이 API를 호출하여 더 이상 해당 사용자의 정보로 카카오 API를 호출할 수 없도록 합니다.

로그아웃 요청 성공 시, 응답 코드와 로그아웃된 사용자의 회원번호를 받습니다. 로그아웃 시에도 웹 브라우저의 카카오계정 세션은 만료되지 않고, 로그아웃을 호출한 앱의 토큰만 만료됩니다. 따라서 웹 브라우저의 카카오계정 로그인 상태는 로그아웃을 호출해도 유지됩니다. 로그아웃 후에는 서비스 초기 화면으로 리다이렉트하는 등 후속 조치를 취하도록 합니다.

참고: 카카오계정 로그아웃

서비스에서 필요에 따라 웹 브라우저의 카카오계정 로그인 상태 또한 로그아웃 처리하여야 할 때는 추가 기능인 카카오계정과 함께 로그아웃을 사용해 카카오계정 세션을 만료시켜야 합니다.

Request: 액세스 토큰 사용

URL

POST /v1/user/logout HTTP/1.1 Host: kapi.kakao.com Authorization: Bearer ${ACCESS_TOKEN}

Header

Name Description Required Authorization 사용자 인증 수단, 액세스 토큰 값

Authorization: Bearer ${ACCESS_TOKEN} O

Request: 어드민 키 사용

URL

POST /v1/user/logout HTTP/1.1 Host: kapi.kakao.com Authorization: KakaoAK ${APP_ADMIN_KEY}

Header

Name Description Required Authorization 사용자 인증 수단, 앱 어드민 키

Authorization: KakaoAK ${APP_ADMIN_KEY} O

Parameter

Name Type Description Required target_id_type String 회원번호 종류, user_id 로 고정 O target_id Long 서비스에서 로그아웃시킬 사용자의 회원번호 O

Response

Name Type Description Required id Long 로그아웃된 사용자의 회원번호 O

Sample

Request: 액세스 토큰 사용

curl -v -X POST “https://kapi.kakao.com/v1/user/logout” \ -H “Content-Type: application/x-www-form-urlencoded” \ -H “Authorization: Bearer ${ACCESS_TOKEN}”

Request: 어드민 키 사용

curl -v -X POST “https://kapi.kakao.com/v1/user/logout” \ -H “Content-Type: application/x-www-form-urlencoded” \ -H “Authorization: KakaoAK ${APP_ADMIN_KEY}” \ -d “target_id_type=user_id” \ -d “target_id=123456789”

Response

HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 { “id”:123456789 }

카카오계정과 함께 로그아웃

기본 정보

카카오계정과 함께 로그아웃은 웹 브라우저에 로그인된 카카오계정의 세션을 만료시키고, 서비스에서도 로그아웃 처리할 때 사용하는 로그아웃 추가 기능입니다. 카카오계정과 함께 로그아웃 기능의 설명과 동작에 대한 자세한 내용은 이해하기, 설정 방법은 설정하기를 각각 참고합니다.

기본적인 로그아웃은 토큰을 만료시켜 해당 사용자 정보로 더 이상 카카오 API를 호출할 수 없도록 하는 기능으로, 서비스 로그아웃과 카카오계정 로그아웃을 각각 수행해야 합니다. 이와 달리 카카오계정과 함께 로그아웃 기능은 카카오계정 로그아웃 처리 후 Logout Redirect URI 로 302 리다이렉트(Redirect)하여 서비스 로그아웃까지 연속해서 수행할 수 있도록 구성돼 있습니다.

기능 동작이 다르기 때문에 기본적인 로그아웃과 카카오계정과 함께 로그아웃은 요청 URL 및 파라미터가 서로 다른 점에 유의합니다. 앱의 REST API 키를 client_id , 서비스 로그아웃 처리를 하는 서비스 서버의 주소를 Logout Redirect URI 파라미터에 담아 GET 으로 요청합니다. 로그아웃 과정 중 유지하고자 하는 특정 값이 있다면 state 파라미터에 담아 요청 시 함께 전달할 수 있습니다.

서비스 서버의 Logout Redirect URI 로 전달된 서비스 로그아웃 요청에 대한 처리는 자체적으로 구현해야 합니다. 카카오 인증 서버는 서비스 로그아웃 처리 결과를 전달받지 않습니다.

Request

URL

GET /oauth/logout?client_id=${REST_API_KEY}&logout_redirect_uri=${LOGOUT_REDIRECT_URI} HTTP/1.1 Host: kauth.kakao.com

Parameter

Name Type Description Required client_id String 앱 REST API 키

[내 애플리케이션] > [앱 키]에서 확인 가능 O logout_redirect_uri String 서비스 회원 로그아웃 처리를 수행할 Logout Redirect URI

[내 애플리케이션] > [카카오 로그인] > [Logout Redirect URI]에 등록된 값 중 하나 O state String 카카오 로그인 과정 중 동일한 값을 유지하는 임의의 문자열(정해진 형식 없음)

Cross-Site Request Forgery(CSRF) 공격으로부터 카카오 로그인 요청을 보호하기 위해 사용

각 사용자의 로그인 요청에 대한 state 값은 고유해야 함

인가 코드 요청, 인가 코드 응답, 토큰 발급 요청의 state 값 일치 여부로 요청 및 응답 유효성 확인 가능 X

Response

Name Type Description Required state String 요청 시 전달한 state 값과 동일한 값 X

Sample

Request

curl -v -X GET “https://kauth.kakao.com/oauth/logout?client_id=${YOUR_REST_API_KEY}&logout_redirect_uri=${YOUR_LOGOUT_REDIRECT_URI}”

Response

HTTP/1.1 302 Found Location: ${LOGOUT_REDIRECT_URI}?state=${STATE}

연결 끊기

기본 정보

연결 끊기는 앱과 사용자 카카오계정의 연결을 끊는 기능입니다. 자세한 설명은 연결과 연결 끊기를 참고합니다.

REST API 사용 시 연결 끊기는 사용자의 액세스 토큰 또는 앱 어드민 키(Admin key)로 API를 호출할 수 있습니다. 서비스 종료 등 상황에 따라 토큰으로 연결 끊기를 요청할 수 없는 경우가 있기 때문에 앱 어드민 키를 사용한 요청을 지원합니다.

하지만 앱 어드민 키는 절대로 유출되어선 안 되는 중요한 키입니다. 정보 보안을 위해 어드민 키를 사용한 REST API 요청은 꼭 서버에서만 사용하고, 소스 코드에는 어드민 키를 사용하지 않도록 유의합니다. 어드민 키를 사용해 연결 끊기를 할 경우, 대상 사용자를 명시하는 파라미터를 함께 보내야 합니다.

연결 끊기 요청에 성공하면 해당 사용자 회원번호를 응답으로 받습니다. 또한 로그아웃이 함께 진행되어 액세스 토큰과 리프레시 토큰이 만료 처리됩니다.

Request: 액세스 토큰 사용

URL

POST /v1/user/unlink HTTP/1.1 Host: kapi.kakao.com Authorization: Bearer ${ACCESS_TOKEN}

Header

Name Description Required Authorization 사용자 인증 수단, 액세스 토큰 값

Authorization: Bearer ${ACCESS_TOKEN} O

Request: 어드민 키 사용

URL

POST /v1/user/unlink HTTP/1.1 Host: kapi.kakao.com Authorization: KakaoAK ${APP_ADMIN_KEY}

Header

Name Description Required Authorization 사용자 인증 수단, 앱 어드민 키

Authorization: KakaoAK ${APP_ADMIN_KEY} O

Parameter

Name Type Description Required target_id_type String 회원번호 종류, user_id 로 고정 O target_id Long 연결을 끊을 사용자의 회원번호 O

Response

Name Type Description Required id Long 연결 끊기에 성공한 사용자의 회원번호 O

Sample

Request: 액세스 토큰 사용

curl -v -X POST “https://kapi.kakao.com/v1/user/unlink” \ -H “Content-Type: application/x-www-form-urlencoded” \ -H “Authorization: Bearer ${ACCESS_TOKEN}”

Request: 어드민 키 사용

curl -v -X POST “https://kapi.kakao.com/v1/user/unlink” \ -H “Content-Type: application/x-www-form-urlencoded” \ -H “Authorization: KakaoAK ${APP_ADMIN_KEY}” \ -d “target_id_type=user_id” \ -d “target_id=123456789”

Response

{ “id”: 123456789 }

사용자 정보 가져오기

기본 정보

현재 로그인한 사용자의 정보를 불러옵니다. 이 API를 사용하려면 동의 항목 설정을 참고하여 각 응답 필드에 필요한 동의 항목을 설정해야 합니다. 동의 항목이 설정되어 있더라도 사용자가 동의하지 않으면 사용자 정보를 받을 수 없습니다. 동의 내역 확인하기 API를 통해 사용자가 동의한 동의 항목을 먼저 확인할 수 있습니다.

사용자 액세스 토큰 또는 어드민 키를 헤더(Header)에 담아 GET 또는 POST 로 요청합니다. 사용자 정보 요청 REST API는 사용자 액세스 토큰을 사용하는 방법, 앱 어드민 키를 사용하는 방법 두 가지로 제공됩니다. 어드민 키는 보안에 유의하여 사용해야 하므로 서버에서 호출할 때만 사용합니다.

property_keys 파라미터를 사용하면 특정 정보만 지정해 요청할 수 있습니다. secure_resource 파라미터로는 URL 응답 값을 HTTPS 로 받을지 지정할 수 있습니다. 어드민 키로 요청할 때는 어떤 사용자의 정보가 필요한지 명시하기 위해 target_id 및 target_id_type 파라미터로 대상 사용자의 회원번호를 함께 전달합니다.

사용자 정보에는 [내 애플리케이션] > [사용자 프로퍼티] 메뉴에서 설정한 사용자 프로퍼티가 포함됩니다.

사용자 정보 요청 성공 시, 응답 바디(Body)는 사용자 정보를 포함한 JSON 객체를 반환합니다.

Request: 액세스 토큰 사용

URL

GET/POST /v2/user/me HTTP/1.1 Host: kapi.kakao.com Authorization: Bearer ${ACCESS_TOKEN} Content-type: application/x-www-form-urlencoded;charset=utf-8

Header

Name Description Required Authorization 사용자 인증 수단, 액세스 토큰 값

Authorization: Bearer ${ACCESS_TOKEN} O

Parameter

Name Type Description Required secure_resource Boolean 이미지 URL 값 HTTPS 여부, true 설정 시 HTTPS 사용, 기본 값 false X property_keys String[] Property 키 목록, JSON Array를 [“kakao_account.email”]과 같은 형식으로 사용 X

Request: 어드민 키 사용

URL

GET/POST /v2/user/me HTTP/1.1 Host: kapi.kakao.com Authorization: KakaoAK ${APP_ADMIN_KEY} Content-type: application/x-www-form-urlencoded;charset=utf-8

Header

Name Description Required Authorization 사용자 인증 수단, 앱 어드민 키

Authorization: KakaoAK ${APP_ADMIN_KEY} O

Parameter

Name Type Description Required target_id_type String 회원번호 종류, user_id 로 고정 O target_id Long 사용자 정보를 가져올 사용자의 회원번호 O secure_resource Boolean 이미지 URL 값 HTTPS 여부, true 설정 시 HTTPS 사용, 기본 값 false X property_keys String[] Property 키 목록, JSON Array를 [“kakao_account.email”]과 같은 형식으로 사용 X

property_keys

Name Description kakao_account.profile 카카오계정의 프로필 소유 여부

실시간 닉네임과 프로필 사진 URL kakao_account.name 카카오계정의 이름 소유 여부, 이름 값 kakao_account.email 카카오계정의 이메일 소유 여부

이메일 값, 이메일 인증 여부, 이메일 유효 여부 kakao_account.age_range 카카오계정의 연령대 소유 여부, 연령대 값 kakao_account.birthday 카카오계정의 생일 소유 여부, 생일 값 kakao_account.gender 카카오계정의 성별 소유 여부, 성별 값

* properties.nickname, properties.profile_image, properties.thumbnail_image: Deprecated, 공지 참고

Response

Name Type Description Required id Long 회원번호 O has_signed_up Boolean 자동 연결 설정을 비활성화한 경우만 존재

연결하기 호출의 완료 여부

false : 연결 대기(Preregistered) 상태

true : 연결(Registered) 상태 X connected_at Datetime 서비스에 연결 완료된 시각, UTC* X synched_at Datetime 카카오싱크 간편가입을 통해 로그인한 시각, UTC* X properties JSON 사용자 프로퍼티(Property)

사용자 프로퍼티 참고 X kakao_account KakaoAccount 카카오계정 정보 X

* UTC: 한국 시간(KST)과 9시간 차이, RFC3339: Date and Time on the Internet 참고

KakaoAccount

* UTC: 한국 시간(KST)과 9시간 차이, RFC3339: Date and Time on the Internet 참고

* has_${FIELD_NAME}: Deprecated, 각 사용자 정보 값 소유 여부(Boolean), API를 통한 해당 사용자 정보의 제공 가능 여부를 확인하는 용도로 사용할 수 없음, needs_agreement 참고

프로필 정보 동의 항목 분리 2021년 6월 25일부터 프로필 정보가 [닉네임]과 [프로필 사진]으로 분리되어 제공됩니다. 분리된 동의 항목인 [닉네임]과 [프로필 사진] 동의 항목을 각각 설정하여 서비스에 필요한 프로필 정보만 선택적으로 제공받을 수 있습니다. 기존 [프로필(닉네임/프로필 사진)] 동의 항목을 사용 중인 앱에서는 기존과 같이 해당 동의 항목을 통해 닉네임과 프로필 사진 정보를 모두 받을 수 있습니다. 기존 동의 항목을 사용하던 앱에서 분리된 동의 항목을 사용하려면 데브톡을 통해 변경을 요청합니다. 이 경우, 응답 구성이 변경될 수 있으므로 주의합니다. 자세한 사항은 공지사항을 참고합니다.

profile

Name Type Description Required nickname String 닉네임

필요한 동의 항목: 프로필 정보(닉네임/프로필 사진) 또는 닉네임 X thumbnail_image_url String 프로필 미리보기 이미지 URL

110px * 110px 또는 100px * 100px

필요한 동의 항목: 프로필 정보(닉네임/프로필 사진) 또는 프로필 사진 X profile_image_url String 프로필 사진 URL

640px * 640px 또는 480px * 480px

필요한 동의 항목: 프로필 정보(닉네임/프로필 사진) 또는 프로필 사진 X is_default_image Boolean 프로필 사진 URL이 기본 프로필 사진 URL인지 여부

사용자가 등록한 프로필 사진이 없을 경우, 기본 프로필 사진 제공

true : 기본 프로필 사진

false : 사용자가 등록한 프로필 사진

필요한 동의 항목: 프로필 정보(닉네임/프로필 사진) 또는 프로필 사진 X

Sample

Request: 액세스 토큰 사용하여 모든 정보 받기

curl -v -X GET “https://kapi.kakao.com/v2/user/me” \ -H “Authorization: Bearer ${ACCESS_TOKEN}”

Request: 액세스 토큰 사용하여 email 정보 받기

curl -v -X POST “https://kapi.kakao.com/v2/user/me” \ -H “Content-Type: application/x-www-form-urlencoded” \ -H “Authorization: Bearer ${ACCESS_TOKEN}” \ –data-urlencode ‘property_keys=[“kakao_account.email”]’

Request: 어드민 키 사용하여 email 정보 받기

curl -v -X POST “https://kapi.kakao.com/v2/user/me” \ -H “Content-Type: application/x-www-form-urlencoded” \ -H “Authorization: KakaoAK ${APP_ADMIN_KEY}” \ -d “target_id_type=user_id” \ -d “target_id=123456789” \ –data-urlencode ‘property_keys=[“kakao_account.email”]’

Response: 성공, 모든 사용자 정보 포함

일부 사용자 정보의 동의 항목은 설정 권한 필요, 동의 항목 참고

HTTP/1.1 200 OK { “id”:123456789, “kakao_account”: { // 프로필 또는 닉네임 동의 항목 필요 “profile_nickname_needs_agreement “: false, // 프로필 또는 프로필 사진 동의 항목 필요 “profile_image_needs_agreement “: false, “profile”: { // 프로필 또는 닉네임 동의 항목 필요 “nickname”: “홍길동”, // 프로필 또는 프로필 사진 동의 항목 필요 “thumbnail_image_url”: “http://yyy.kakao.com/…/img_110x110.jpg”, “profile_image_url”: “http://yyy.kakao.com/dn/…/img_640x640.jpg”, “is_default_image”:false }, // 이름 동의 항목 필요 “name_needs_agreement”:false, “name”:”홍길동”, // 카카오계정(이메일) 동의 항목 필요 “email_needs_agreement”:false, “is_email_valid”: true, “is_email_verified”: true, “email”: “[email protected]”, // 연령대 동의 항목 필요 “age_range_needs_agreement”:false, “age_range”:”20~29″, // 출생 연도 동의 항목 필요 “birthyear_needs_agreement”: false, “birthyear”: “2002”, // 생일 동의 항목 필요 “birthday_needs_agreement”:false, “birthday”:”1130″, “birthday_type”:”SOLAR”, // 성별 동의 항목 필요 “gender_needs_agreement”:false, “gender”:”female”, // 카카오계정(전화번호) 동의 항목 필요 “phone_number_needs_agreement”: false, “phone_number”: “+82 010-1234-5678”, // CI(연계정보) 동의 항목 필요 “ci_needs_agreement”: false, “ci”: “${CI}”, “ci_authenticated_at”: “2019-03-11T11:25:22Z”, }, “properties”:{ “${CUSTOM_PROPERTY_KEY}”: “${CUSTOM_PROPERTY_VALUE}”, … } }

Response: 성공, 앱에 닉네임 동의 항목만 설정하고 사용자에게 동의받은 경우

HTTP/1.1 200 OK { “id”:123456789, “kakao_account”: { “profile_nickname_needs_agreement”: false, “profile”: { “nickname”: “홍길동” } }, “properties”:{ “${CUSTOM_PROPERTY_KEY}”: “${CUSTOM_PROPERTY_VALUE}”, … } }

사용자 정보 저장하기

기본 정보

사용자 프로퍼티에 값을 저장합니다. 키 값은 [내 애플리케이션] > [사용자 프로퍼티]에 정의한 값을 사용해야 합니다.

properties 파라미터에 액세스 토큰과 함께 저장할 항목의 키와 값을 JSON 형식의 목록으로 담아 POST 로 요청합니다. 파라미터 구성 방법은 요청 예제를 참고합니다. 사용자 프로퍼티 저장에 성공하면 응답 코드와 해당 사용자 회원번호를 받습니다.

저장한 사용자 프로퍼티는 사용자 정보 가져오기를 통해 사용할 수 있습니다. 해당 사용자의 정보 전체를 불러오거나, 파라미터로 특정 정보만 지정해 불러올 수 있습니다.

Request

URL

POST /v1/user/update_profile HTTP/1.1 Host: kapi.kakao.com Authorization: Bearer ${ACCESS_TOKEN} Content-type: application/x-www-form-urlencoded;charset=utf-8

Header

Name Description Required Authorization 사용자 인증 수단, 액세스 토큰 값

Authorization: Bearer ${ACCESS_TOKEN} O

Parameter

Name Type Description Required properties JSON {“${CUSTOM_PROPERTY_KEY}”:”${CUSTOM_PROPERTY_VALUE}”} 형식의 사용자 프로퍼티 키, 값 목록 O

Response

Name Type Description Required id Long 회원번호 O

Sample

Request

curl -v -X POST “https://kapi.kakao.com/v1/user/update_profile” \ -H “Content-Type: application/x-www-form-urlencoded” \ -H “Authorization: Bearer ${ACCESS_TOKEN}” \ –data-urlencode ‘properties={“${CUSTOM_PROPERTY_KEY}”:”${CUSTOM_PROPERTY_VALUE}”}’

Response

HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 { “id”:123456789 }

사용자 목록 가져오기

기본 정보

앱의 사용자 회원번호 목록을 제공하는 API입니다. 이 API는 관리자를 위한 것으로, 앱 어드민 키를 사용하기 때문에 반드시 서버에서만 호출해야 합니다.

앱 어드민 키를 헤더에 담아 GET 으로 요청하며, 파라미터를 사용해 회원번호 조회 범위 및 정렬 순서를 지정할 수 있습니다. 응답은 JSON 객체로 전달되며 검색 조건에 맞는 사용자 회원번호 목록을 포함합니다. 사용자 수가 많아 한 번에 전달할 수 없을 경우, 이전 또는 다음 페이지 URL을 포함합니다. 해당 URL을 통해 사용자 목록의 이전 또는 다음 페이지를 추가 확인할 수 있습니다.

Request

URL

GET /v1/user/ids HTTP/1.1 Host: kapi.kakao.com Authorization: KakaoAK ${APP_ADMIN_KEY} Content-type: application/x-www-form-urlencoded;charset=utf-8

Header

Name Description Required Authorization 사용자 인증 수단, 앱 어드민 키

Authorization: KakaoAK ${APP_ADMIN_KEY} O

Parameter

Name Type Description Required limit Integer 페이지당 사용자 수

최소 1 , 최대 100 , 기본값 100 X from_id Long 페이징 시작 기준이 되는 사용자 회원번호, 사용자 목록은 from_id과 그보다 큰 회원 번호를 가진 사용자가 포함됨

일반적으로 Response에서 나온 결과를 이용

값이 없을 경우 가장 작은 회원번호를 가진 사용자부터 읽기 X order String 페이지 검색 방향

asc 또는 desc

기본값 asc X

Response

Name Type Description Required elements Integer[] 회원번호 목록 O before_url String 이전 페이지 URL, 이전 페이지가 없을 경우 null X after_url String 다음 페이지 URL, 다음 페이지가 없을 경우 null X

* total_count: Deprecated, 앱의 사용자 수(Integer), 사용자 통계는 [내 애플리케이션] > [통계] > [사용자]에서 확인 가능, 공지 참고

Sample

Request: 첫 사용자 100명 정보 받기

curl -v -X GET “https://kapi.kakao.com/v1/user/ids” \ -H “Authorization: KakaoAK ${APP_ADMIN_KEY}”

Request: 회원번호 12345와 그보다 큰 회원번호를 가진 사용자 3명 정보 보기

curl -v -G GET “https://kapi.kakao.com/v1/user/ids” \ -H “Authorization: KakaoAK ${APP_ADMIN_KEY}” \ -d “limit=3&order=asc” \ -d “from_id=12345”

Response

HTTP/1.1 200 OK { “elements”: [ 1376016924426111111, 1376016924426222222, 1376016924426333333 ], “before_url”: “http://kapi.kakao.com/v1/user/ids?limit=3&order=desc&from_id=1376016924426111111&app_key=12345674ae6e12379d5921f4417b399e7”, “after_url”: “http://kapi.kakao.com/v1/user/ids?limit=3&order=asc&from_id=1376016924426333333&app_key=12345674ae6e12379d5921f4417b399e7” }

여러 사용자 정보 가져오기

기본 정보

앱 사용자 여러 명의 정보를 불러옵니다. 이 API는 관리자를 위한 것으로, 앱 어드민 키를 사용하기 때문에 반드시 서버에서만 호출해야 합니다.

앱 어드민 키를 헤더에 담아 GET 으로 요청합니다. 정보를 요청할 사용자 목록을 target_ids 파라미터에 배열로 담아 전달해야 합니다.

응답은 요청 시 지정한 사용자 정보 목록을 포함합니다. 이 API의 기본 응답은 회원번호, 연결 시각과 같은 기본적인 정보만 포함합니다. property_keys 파라미터를 사용해 원하는 사용자 정보를 추가 요청할 수 있습니다. 추가 요청할 사용자 정보는 앱에 동의 항목 설정이 되어 있어야 합니다.

property_keys 파라미터 값은 요청할 사용자 정보와 사전 정의된 사용자 프로퍼티 키(Key)의 문자열(String) 배열로 구성하여 다음과 같이 전달합니다.

property_keys=[“id”,”has_signed_up”,”kakao_account.email”]

조회할 사용자 정보에 하위 항목이 존재하는 경우, 다음과 같이 상위 항목의 키에 온점(.)을 추가해 모든 하위 항목을 요청할 수 있습니다.

property_keys=[“kakao_account.”,”properties.”]

특정 하위 항목만 요청하려면, 다음과 같이 온점(.) 뒤에 하위 항목의 키를 명시하여 전달합니다.

property_keys=[“kakao_account.email”,”kakao_account.gender”]

세트로 구성된 응답은 관련 정보가 함께 전달됩니다. 예를 들어 property_keys 에 “kakao_account.email”을 포함해 이메일 정보를 요청한 경우, 관련 정보인 kakao_account.has_email , kakao_account.email_needs_agreement , kakao_account.is_email_valid , kakao_account.is_email_verified 가 응답에 함께 포함됩니다.

사용자 정보 전체를 요청하려면 아래와 같이 property_keys 파라미터 값을 전달합니다.

property_keys=[“kakao_account.”,”properties.”,”has_signed_up”]

별도 파라미터 지정 없이 특정 사용자 한 명의 사용자 정보 전체를 요청하려면 사용자 정보 가져오기 API를 사용합니다.

Request

URL

GET /v2/app/users HTTP/1.1 Host: kapi.kakao.com Authorization: KakaoAK ${APP_ADMIN_KEY} Content-type: application/x-www-form-urlencoded;charset=utf-8

Header

Name Description Required Authorization 사용자 인증 수단, 앱 어드민 키

Authorization: KakaoAK ${APP_ADMIN_KEY} O

Parameter

Name Type Description Required target_ids Long[] 조회할 회원번호 목록

최대 100명의 사용자 정보 요청 가능

property_keys 로 사용자 정보를 지정해 요청하는 경우, 최대 20명의 사용자 정보 요청 가능 O target_id_type String target_ids 에 포함된 회원번호 종류

user_id 로 고정 O property_keys String[] 응답에 포함할 사용자 프로퍼티의 키

각 사용자 정보 및 사용자 프로퍼티 키 사용 가능

미지정 시 기본 응답만 제공 X

Response

Name Type Description Required elements List 사용자 정보 목록

여러 사용자 정보 가져오기 API의 기본 응답에서는 ID와 같은 일부 기본 정보만 포함

기본 응답 외 정보는 property_keys 파라미터로 지정해 응답에 포함하도록 요청 가능

요청 가능한 정보의 종류는 사용자 정보 참고 O

Name Type Description Required id Long 회원번호( user_id ) O synched_at Datetime 카카오싱크 간편가입을 통해 로그인한 시각, UTC* X connected_at Datetime 서비스에 연결 완료된 시각, UTC* X kakao_account KakaoAccount 카카오계정 정보 X properties JSON 사용자 프로퍼티

사용자 프로퍼티 참고 X

* UTC: 한국 시간(KST)과 9시간 차이, RFC3339: Date and Time on the Internet 참고

Sample

Request

curl -v -G GET “https://kapi.kakao.com/v2/app/users” \ -H “Authorization: KakaoAK ${APP_ADMIN_KEY}” \ -d “target_id_type=user_id” \ –data-urlencode “target_ids=[1399634384,1406264199]”

Request: property_keys로 이메일, 프로필 지정 요청

curl -v -G GET “https://kapi.kakao.com/v2/app/users” \ -H “Authorization: KakaoAK ${APP_ADMIN_KEY}” \ -d “target_id_type=user_id” \ –data-urlencode “target_ids=[1399634384,1406264199]” \ –data-urlencode ‘property_keys=[“kakao_account.email”,”kakao_account.profile”]’

Request: 조회 가능한 모든 사용자 정보 요청

curl -v -G GET “https://kapi.kakao.com/v2/app/users” \ -H “Authorization: KakaoAK ${SERVICE_APP_ADMIN_KEY}” \ -d “target_id_type=user_id” \ –data-urlencode “target_ids=[1285016924429472463]” \ –data-urlencode ‘property_keys=[“kakao_account.”,”properties.”,”has_signed_up”]’

Response

[ { “id”:1406264199, “connected_at”:”2020-07-14T06:15:36Z”, // 카카오싱크 서비스에만 존재 “synched_at”:”2020-07-14T06:15:36Z” }, { “id”:1399634384, “connected_at”:”2020-07-06T09:55:51Z”, // 카카오싱크 서비스에만 존재 “synched_at”:”2020-07-06T09:55:51Z” } … ]

Response: property_keys로 이메일, 프로필 지정 요청

[ { “id”:1399634384, “connected_at”:”2020-07-06T09:55:51Z”, “kakao_account”:{ “profile_needs_agreement”:false, “profile”:{ “nickname”:”춘식이”, “thumbnail_image_url”:”http://k.kakaocdn.net/dn/zK7QA/btqzpE4aqO1/pl2HpfVBUI9s1SSrstperq/img_110x110.jpg”, “profile_image_url”:”http://k.kakaocdn.net/dn/zK7QA/btqzpE4aqO1/pl2HpfVBUI9s1wqsgrEAVk/img_640x640.jpg”, “is_default_image”:false }, “has_email”:true, “email_needs_agreement”:false, “is_email_valid”:true, “is_email_verified”:true, “email”:”[email protected]” } }, { “id”:1406264199, “connected_at”:”2020-07-14T06:15:36Z”, “kakao_account”:{ “profile_needs_agreement”:false, “profile”:{ “nickname”:”나비”, “thumbnail_image_url”:”http://k.kakaocdn.net/dn/DCjQu/btqti3A2gEc/zgQwddmSnG7CDfmKtTO1/img_110x110.jpg”, “profile_image_url”:”http://k.kakaocdn.net/dn/DCjQu/btqti3A2gEc/zgip1O4JmSnG8sDfmKtTO1/img_640x640.jpg”, “is_default_image”:false }, “has_email”:true, “email_needs_agreement”:true } } … ]

Response: 모든 사용자 정보 요청

사용자 정보 가져오기 응답 예제 참고

추가 항목 동의 받기

기본 정보

추가 항목 동의 받기는 사용자가 첫 카카오 로그인 시 동의 화면에서 동의하지 않았지만, 서비스 이용 중 추가로 동의해야 하는 항목을 동의 요청하는 기능입니다. 추가 항목 동의 받기의 상세 설명을 확인한 후 이 API를 사용해야 합니다. 또한 이 API를 사용하려면 동의 항목 설정을 참고하여 필요한 동의 항목을 설정해야 합니다.

추가 항목 동의 받기는 인가 코드 받기에 scope 파라미터로 추가 동의 받을 항목의 키를 전달해 요청합니다. 추가 항목 동의 받기 요청 시에는 scope 파라미터를 반드시 포함해야 합니다.

요청 시 카카오 인증 서버는 사용자에게 추가 동의 받을 항목의 동의를 요청하는 화면을 출력합니다. 사용자가 해당 항목에 동의하면 추가 동의가 성공 및 완료되고, 사용자가 취소하면 추가 동의 요청이 실패합니다.

추가 항목 동의 받기 요청이 성공하여 사용자 동의가 완료되면 인가 코드를 발급 받습니다. 해당 인가 코드로 토큰 받기를 요청하고, 이후 카카오 API 요청 시 새로 발급 받은 토큰을 사용해야 합니다.

Request

URL

GET /oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code&scope={required_scopes.join(‘,’)} HTTP/1.1 Host: kauth.kakao.com

Parameter

Name Type Description Required client_id String 앱 REST API 키

[내 애플리케이션] > [앱 키]에서 확인 가능 O redirect_uri String 인가 코드가 리다이렉트될 URI O response_type String code 로 고정 O scope String 추가 동의 받을 항목의 키, 사용자 정보 참고

[내 애플리케이션] > [카카오 로그인] > [동의 항목]에서 해당 동의 항목의 ID 값 확인하여 사용

쉼표(,)로 구분해 여러 개 전달 가능

주의: OpenID Connect를 사용하는 앱의 경우, scope 파라미터 값에 openid 를 반드시 포함해야 함, 미포함 시 ID 토큰이 재발급되지 않음 (참고: scope 파라미터) O state String 카카오 로그인 과정 중 동일한 값을 유지하는 임의의 문자열(정해진 형식 없음)

Cross-Site Request Forgery(CSRF) 공격으로부터 카카오 로그인 요청을 보호하기 위해 사용

각 사용자의 로그인 요청에 대한 state 값은 고유해야 함

인가 코드 요청, 인가 코드 응답, 토큰 발급 요청의 state 값 일치 여부로 요청 및 응답 유효성 확인 가능 X nonce String OpenID Connect를 통해 ID 토큰을 함께 발급받을 경우, ID 토큰 재생 공격을 방지하기 위해 사용

ID 토큰 유효성 검증 시 대조할 임의의 문자열(정해진 형식 없음) X

Response

카카오 로그인 인가 코드 받기와 동일, 해당 문서 참고

Sample

Request: 이메일 동의 항목의 추가 동의 요청

https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code&scope=account_email

Request: OpenID Connect를 사용하는 앱, scope 파라미터 값에 openid 포함

https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code&scope=account_email,openid

동의 내역 확인하기

기본 정보

사용자가 동의한 동의 항목의 상세 정보 목록을 조회합니다. [내 애플리케이션] > [카카오 로그인] > [동의 항목]에 설정된 동의 항목의 목록과 사용자가 동의한 동의 항목의 상세 정보를 반환합니다. 사용자가 기존에 동의했던 동의 항목이라면 현재 앱에 사용하도록 설정돼 있지 않아도 응답에 포함됩니다.

사용자 액세스 토큰을 사용하는 방법, 앱 어드민 키를 사용하는 방법 두 가지로 제공됩니다. 사용자 액세스 토큰 또는 어드민 키를 헤더(Header)에 담아 GET 으로 요청합니다. 어드민 키로 요청할 때는 어떤 사용자의 정보가 필요한지 명시하기 위해 대상 사용자의 회원번호를 함께 전달합니다.

성공 시 앱에서 설정한 동의 항목(Scope) 목록을 받습니다. 사용자가 동의한 항목은 agreed 값이 true 로 전달됩니다. 특정 동의 항목의 동의 내역만 확인하려면 scopes 파라미터로 동의 항목의 ID를 지정하여 요청할 수 있으며, 성공 시 응답은 지정된 동의 항목의 정보만 포함합니다.

Request: 액세스 토큰 사용

URL

GET /v2/user/scopes HTTP/1.1 Host: kapi.kakao.com Authorization: Bearer ${ACCESS_TOKEN}

Header

Name Description Required Authorization 사용자 인증 수단, 액세스 토큰 값

Authorization: Bearer ${ACCESS_TOKEN} O

Parameter

Name Type Description Required scopes String[] 특정 동의 항목에 대한 동의 내역만 불러오려는 경우 사용

동의 항목의 ID 목록

쉼표(,)를 구분자로 여러 ID를 하나의 문자열에 담아 전달 X

Request: 어드민 키 사용

URL

GET /v2/user/scopes HTTP/1.1 Host: kapi.kakao.com Authorization: KakaoAK ${APP_ADMIN_KEY}

Header

Name Description Required Authorization 사용자 인증 수단, 앱 어드민 키

Authorization: KakaoAK ${APP_ADMIN_KEY} O

Parameter

Name Type Description Required target_id_type String 회원번호 종류, user_id 로 고정 O target_id Long 동의 내역을 확인할 사용자의 회원번호 O scopes String[] 특정 동의 항목에 대한 동의 내역만 불러오려는 경우 사용

동의 항목의 ID 목록

쉼표(,)를 구분자로 여러 ID를 하나의 문자열에 담아 전달 X

Response

Name Type Description Required id Long 회원번호 O scopes scopes 해당 앱의 동의 항목(Scope) 목록 O

scopes

Name Type Description Required id String 동의 항목 ID O display_name String 사용자 동의 화면에 출력되는 동의 항목의 이름 또는 설명 O type String 동의 항목 타입, PRIVACY 또는 SERVICE

PRIVACY : 개인정보 보호 동의 항목

SERVICE : 접근권한 관리 동의 항목 O using Boolean 해당 앱에서 동의 항목 사용 여부

true : 현재 앱에서 사용 중인 동의 항목일 경우

false : 사용자가 동의했으나 현재 앱에 설정되어 있지 않은 동의 항목일 경우 O agreed Boolean 사용자 동의 여부

true : 사용자가 동의한 경우

false : 사용자가 동의하지 않은 경우 O revocable Boolean 동의 항목의 동의 철회 가능 여부

사용자가 동의( “agreed”=true )한 동의 항목인 경우에만 응답에 포함

true : 동의 철회 가능

false : 동의 철회 불가능 X

Sample

Request: 액세스 토큰 사용

curl -v -X GET “https://kapi.kakao.com/v2/user/scopes” \ -H “Authorization: Bearer ${ACCESS_TOKEN}”

Request: 액세스 토큰 사용하여 특정 동의 항목만 조회

curl -v -G GET “https://kapi.kakao.com/v2/user/scopes” \ -H “Authorization: Bearer ${ACCESS_TOKEN}” \ –data-urlencode ‘scopes=[“account_email”,”friends”]’

Request: 어드민 키 사용

curl -v -G GET “https://kapi.kakao.com/v2/user/scopes” \ -H “Authorization: KakaoAK ${APP_ADMIN_KEY}” \ -d “target_id_type=user_id” \ -d “target_id=123456789”

Response

{ “id”:123456789, “scopes”:[ { “id”:”profile”, “display_name”:”Profile Info(nickname/profile image)”, “type”:”PRIVACY”, “using”:true, // 동의 항목 사용 여부 “agreed”:true, // 사용자 동의 여부 “revocable”:false // 동의 철회 가능 여부, “agreed”가 “true”일 경우에만 반환 }, { “id”:”account_email”, “display_name”:”Email”, “type”:”PRIVACY”, “using”:true, // 동의 항목 사용 여부 “agreed”:true, // 사용자 동의 여부 “revocable”:true // 동의 철회 가능 여부, “agreed”가 “true”일 경우에만 반환 }, { “id”:”shipping_address”, “display_name”:”Shipping information (receiver, shipping address, phone number)”, “type”:”PRIVACY”, “using”:true, // 동의 항목 사용 여부 “agreed”:false // 사용자 동의 여부 }, … ] }

Response: 이메일, 카카오 서비스 내 친구 목록에 대한 동의 내역

{ “id”:123456789, “scopes”: [ { “id”:”friends”, “display_name”:”Friends List in Kakao Service(Including profile image, nickname, and favorites)”, “type”:”PRIVACY”, “using”:true, “agreed”:true, “revocable”:false }, { “id”:”account_email”, “display_name”:”Email”, “type”:”PRIVACY”, “using”:true, “agreed”:false } ] }

동의 철회하기

기본 정보

사용자가 동의한 항목에 대해 동의를 철회합니다. 동의 내역 확인하기를 통해 조회한 동의 항목 정보 중 동의 철회 가능 여부( revocable ) 값이 true 인 동의 항목만 철회 가능합니다. 동의 철회가 불가능한 동의 항목을 대상으로 요청한 경우 에러 응답을 받습니다.

액세스 토큰을 사용하는 방법, 앱 어드민 키를 사용하는 방법 두 가지로 제공됩니다. 액세스 토큰 또는 어드민 키를 헤더(Header)에 담고, 동의를 철회할 동의 항목 목록을 전달하여 POST 로 요청합니다. 어드민 키로 요청할 때는 어떤 사용자의 정보가 필요한지 명시하기 위해 대상 사용자의 회원번호를 함께 전달합니다.

요청 성공 시 변경된 앱의 동의 항목 정보 목록을 받습니다. 각 동의 항목 사용 설정 여부, 사용자 동의 여부, 철회 가능 여부와 같은 상세 정보를 포함합니다. 동의가 철회된 동의항목은 agreed 값을 false 로 반환합니다.

Request: 액세스 토큰 사용

URL

POST /v2/user/revoke/scopes HTTP/1.1 Host: kapi.kakao.com Authorization: Bearer ${ACCESS_TOKEN}

Header

Name Description Required Authorization 사용자 인증 수단, 액세스 토큰 값

Authorization: Bearer ${ACCESS_TOKEN} O

Parameter

Name Type Description Required scopes String[] 동의를 철회할 동의 항목 ID 목록

동의 내역 확인하기 API 응답에서 동의 철회 가능 여부( revocable ) 값이 true 인 동의 항목만 철회 가능 O

Request: 어드민 키 사용

URL

POST /v2/user/revoke/scopes HTTP/1.1 Host: kapi.kakao.com Authorization: KakaoAK ${APP_ADMIN_KEY}

Header

Name Description Required Authorization 사용자 인증 수단, 앱 어드민 키

Authorization: KakaoAK ${APP_ADMIN_KEY} O

Parameter

Name Type Description Required target_id_type String 회원번호 종류, user_id 로 고정 O target_id Long 동의를 철회할 사용자의 회원번호 O scopes String[] 동의를 철회할 동의 항목 ID 목록

동의 내역 확인하기 API 응답에서 동의 철회 가능 여부( revocable ) 값이 true 인 동의 항목만 철회 가능 O

Response

동의 내역 확인하기와 동일, 해당 항목 참고

Sample

Request: 액세스 토큰 사용

curl -v -X POST “https://kapi.kakao.com/v2/user/revoke/scopes” \ -H “Content-Type: application/x-www-form-urlencoded” \ -H “Authorization: Bearer ${ACCESS_TOKEN}” \ –data-urlencode ‘scopes=[“account_email”]’

Request: 어드민 키 사용

curl -v -X POST “https://kapi.kakao.com/v2/user/revoke/scopes” \ -H “Content-Type: application/x-www-form-urlencoded” \ -H “Authorization: KakaoAK ${APP_ADMIN_KEY}” \ -d “target_id_type=user_id” \ -d “target_id=123456789” \ –data-urlencode ‘scopes=[“account_email”]’

Response

{ “id”:123456789, “scopes”:[ { “id”:”profile”, “display_name”:”Profile Info(nickname/profile image)”, “type”:”PRIVACY”, “using”:true, “agreed”:true, “revocable”:false }, { “id”:”friends”, “display_name”:”Friends List in Kakao Service(Including profile image, nickname, and favorites)”, “type”:”PRIVACY”, “using”:true, “agreed”:true, “revocable”:false }, { “id”:”account_email”, “display_name”:”Email”, “type”:”PRIVACY”, “using”:true, “agreed”:false //동의 철회 성공 시 동의 여부 값이 false로 변경됨 }, { “id”:”talk_chats”, “display_name”:”Read chat lists in KakaoTalk”, “type”:”SERVICE”, “using”:true, “agreed”:true, “revocable”:false }, … ] }

Response: 실패, 필수 동의 항목의 철회를 요청한 경우

HTTP/1.1 403 Forbidden { “msg”:”[profile] is not revocable. check out if it’s set as required on developers.kakao.com”, “code”:-3 }

Response: 실패, 철회할 동의 항목 ID가 잘못된 경우

HTTP/1.1 400 Bad Request { “msg”:”There is no scopes to revoke. check out if given scope id([email]) is correct again.”, “code”:-2 }

OpenID Connect

기본 정보

이 항목은 카카오 로그인 OpenID Connect 관련 API의 사용 방법을 안내합니다.

OIDC: 메타데이터 확인하기

카카오 로그인의 OpenID Connect 서비스 제공자 설정을 확인합니다. 카카오 로그인은 OpenID Connect Discovery 표준 규격에 따라 서비스 제공자 설정을 담은 메타데이터(Metadata) 문서를 제공합니다.

Request

https://kauth.kakao.com/.well-known/openid-configuration

Response

Sample

HTTP/1.1 200 OK Content-Type: application/json;charset=utf-8 { “issuer”: “https://kauth.kakao.com”, “authorization_endpoint”: “https://kauth.kakao.com/oauth/authorize”, “token_endpoint”: “https://kauth.kakao.com/oauth/token”, “userinfo_endpoint”: “https://kapi.kakao.com/v1/oidc/userinfo”, “jwks_uri”: “https://kauth.kakao.com/.well-known/jwks.json”, “subject_types_supported”: [“public”], “id_token_signing_alg_values_supported”: [“RS256”], “response_types_supported”: [“code”], “grant_types_supported”: [ “authorization_code”, “refresh_token” ], “code_challenge_methods_supported”: [“S256”], “claims_supported”: [ “iss”, “aud”, “sub”, “auth_time”, “exp”, “iat”, “nonce” ] }

OIDC: 공개키 목록 조회하기

카카오 인증 서버가 ID 토큰 서명 시 사용한 공개키 목록을 조회합니다. 공개키는 일정 주기 또는 특별한 이슈 발생 시 변경될 수 있습니다. 주기적으로 최신 공개키 목록을 조회한 후, 일정 기간 캐싱(Caching)하여 사용할 것을 권장합니다. 지나치게 빈번한 공개키 목록 조회 요청 시, 요청이 차단될 수 있습니다.

요청 성공 시, JSON 형식으로 카카오 인증 서버가 제공하는 공개키 목록을 받습니다. 응답의 공개키 목록 중, ID 토큰의 kid 에 해당하는 공개키를 확인하여 ID 토큰 유효성 검증 시 사용합니다.

Request

https://kauth.kakao.com/.well-known/jwks.json

Response

Name Type Description Required keys JWK[] 공개키 목록을 담은 JSON Web Key (JWK) 배열(참고: RFC7517) O

JWK

Name Type Description Required kid String 공개키 ID O kty String 공개키 타입, RSA 로 고정 O alg String 암호화 알고리즘 O use String 공개키의 용도, sig (서명)으로 고정 O n String 공개키 모듈(Modulus)

공개키는 n 과 e 의 쌍으로 구성됨 O e String 공개키 지수(Exponent)

공개키는 n 과 e 의 쌍으로 구성됨 O

Sample: 요청

curl -v -X GET “https://kauth.kakao.com/.well-known/jwks.json”

Sample: 응답, 성공

HTTP/1.1 200 OK { “keys”: [ { “kid”: “3f96980381e451efad0d2ddd30e3d3”, “kty”: “RSA”, “alg”: “RS256”, “use”: “sig”, “n”: “q8zZ0b_MNaLd6Ny8wd4cjFomilLfFIZcmhNSc1ttx_oQdJJZt5CDHB8WWwPGBUDUyY8AmfglS9Y1qA0_fxxs-ZUWdt45jSbUxghKNYgEwSutfM5sROh3srm5TiLW4YfOvKytGW1r9TQEdLe98ork8-rNRYPybRI3SKoqpci1m1QOcvUg4xEYRvbZIWku24DNMSeheytKUz6Ni4kKOVkzfGN11rUj1IrlRR-LNA9V9ZYmeoywy3k066rD5TaZHor5bM5gIzt1B4FmUuFITpXKGQZS5Hn_Ck8Bgc8kLWGAU8TzmOzLeROosqKE0eZJ4ESLMImTb2XSEZuN1wFyL0VtJw”, “e”: “AQAB” }, { “kid”: “9f252dadd5f233f93d2fa528d12fea”, “kty”: “RSA”, “alg”: “RS256”, “use”: “sig”, “n”: “qGWf6RVzV2pM8YqJ6by5exoixIlTvdXDfYj2v7E6xkoYmesAjp_1IYL7rzhpUYqIkWX0P4wOwAsg-Ud8PcMHggfwUNPOcqgSk1hAIHr63zSlG8xatQb17q9LrWny2HWkUVEU30PxxHsLcuzmfhbRx8kOrNfJEirIuqSyWF_OBHeEgBgYjydd_c8vPo7IiH-pijZn4ZouPsEg7wtdIX3-0ZcXXDbFkaDaqClfqmVCLNBhg3DKYDQOoyWXrpFKUXUFuk2FTCqWaQJ0GniO4p_ppkYIf4zhlwUYfXZEhm8cBo6H2EgukntDbTgnoha8kNunTPekxWTDhE5wGAt6YpT4Yw”, “e”: “AQAB” } ] }

OIDC: ID 토큰 정보 보기

주의: API 용도 ID 토큰 정보 보기 API는 디버깅(Debugging) 용도로 제공되며, 실제 서비스의 ID 토큰 유효성 검증 용도로 사용할 수 없습니다. 용도에 맞지 않는 요청은 차단될 수 있습니다.

ID 토큰 유효성 검증을 위한 참고 정보를 제공합니다. 서비스에서 OpenID Connect(OIDC)를 통해 발급받은 ID 토큰 유효성을 검증할 때, 직접 확인한 페이로드(Payload) 값이 이 API의 응답이 일치하는지 대조하여 확인하는 용도로 사용합니다.

id_token 파라미터에 ID 토큰 값을 담아 POST 로 요청합니다. 요청 성공 시, 요청 시 전달된 ID 토큰의 페이로드 값을 반환합니다. 페이로드만으로는 ID 토큰의 유효성을 검증할 수 없으므로, 서비스에서 자체적으로 ID 토큰 유효성 검증을 통해 ID 토큰 유효성을 검증해야 합니다.

Request

URL

POST /oauth/tokeninfo HTTP/1.1 Host: kauth.kakao.com Content-type: application/x-www-form-urlencoded;charset=utf-8

Parameter

Name Type Description Required id_token String 토큰 받기를 통해 발급받은 ID 토큰 값 문자열 O

Response

ID 토큰 페이로드 참고

Sample: 요청

curl -v POST “https://kauth.kakao.com/oauth/tokeninfo” \ -d “id_token=${ID_TOKEN}”

Response: 응답, 성공

HTTP/1.1 200 OK { “iss”: “https://kauth.kakao.com”, “aud”: “208313”, “sub”: “166959”, “iat”: 1647183250, “exp”: 1647190450, “nonce”: “${NONCE}”, “auth_time”: 1647183250 }

Sample: 응답, 실패, 유효하지 않은 ID 토큰

HTTP/1.1 400 Bad Request { “error”: “invalid_token”, “error_description”: “${ERROR_DESCRIPTION}”, “error_code”: “KOE400” }

OIDC: 사용자 정보 가져오기

현재 로그인한 사용자의 정보를 불러옵니다. 이 API는 카카오계정의 기본적인 사용자 정보만을 제공하며, 이 외 사용자 정보는 사용자 정보 가져오기 API를 통해 받을 수 있습니다. 사용자 정보의 종류와 상세 설명은 사용자 정보를 참고합니다.

사용자 액세스 토큰을 헤더에 담아 GET 으로 요청합니다. 요청 성공 시, 응답 바디에 사용자 정보를 포함한 JSON 객체를 반환합니다. 카카오 로그인 동의 화면에서 사용자가 동의하지 않은 항목의 사용자 정보는 응답에 포함되지 않습니다. 사용자 동의를 참고합니다.

Request

GET /v1/oidc/userinfo HTTP/1.1 Host: kapi.kakao.com Authorization: Bearer ${ACCESS_TOKEN} Content-type: application/x-www-form-urlencoded;charset=utf-8

Response

Sample: 요청

curl -v -X GET “https://kapi.kakao.com/v1/oidc/userinfo” \ -H “Authorization: Bearer ${ACCESS_TOKEN}”

Sample: 응답, 성공

HTTP/ 1.1 200 OK { “sub”: 123456789, “name”: “홍길동”, “nickname”: “홍길동”, “picture”: “${IMAGE_PATH}”, “email”: “[email protected]”, “email_verified”: true, “gender”: “MALE”, “birthdate”: “2002-11-30”, “phone_number”: “+82 00-0000-0000”, “phone_number_verified”: true }

고급: 연결하기

기본 정보

주의: 자동 연결 사용 여부 확인 연결하기는 자동 연결을 사용하지 않는 앱에서만 사용하는 API입니다. 사용 중인 앱의 자동 연결 사용 여부는 [내 애플리케이션] > [카카오 로그인] > [로그인 시 앱 자동 연결] 메뉴에서 확인할 수 있습니다. 해당 설정이 노출되지 않는다면 자동 연결을 사용하는 앱입니다. [로그인 시 앱 자동 연결] 설정이 노출된다면 자동 연결 사용 여부를 설정할 수 있는 앱으로, [사용 안함]으로 설정돼 있을 경우 연결하기 API를 사용해야 합니다.

연결하기 API는 자동 연결을 [사용 안함]으로 설정한 앱에서 앱과 사용자를 수동으로 연결하는 기능입니다. 자동 연결은 카카오 로그인 완료 시 앱과 사용자를 자동으로 연결하는 기능으로, 필요 시 카카오와 협의를 거쳐 자동 연결의 사용 여부를 설정할 수 있습니다. 다음은 앱과 사용자를 수동으로 연결하고자 하는 경우의 예시입니다.

사용자가 카카오 로그인 및 서비스 이용에 동의한 직후 서비스에 가입 완료되지 않는 경우 사용자가 카카오 로그인 후 별도 정보 입력이나 인증 절차를 거쳐 가입 완료하는 경우 사용자가 즉시 가입되지 않고, 서비스에서 일정 주기로 사용자의 가입을 승인하는 경우

이 외, 서비스에서 사용자의 앱 연결 상태를 직접 관리해야 할 필요가 있는 경우

자동 연결을 사용하지 않는 서비스는 반드시 연결하기를 호출해 사용자와 앱을 직접 연결해야 합니다. 또한 사용자의 서비스 가입 상태와 앱 연결 상태가 일치하는지 확인하고 연결하기 및 연결 끊기를 사용해 사용자의 연결 상태를 관리해야 합니다. 따라서 반드시 필요한 경우가 아니라면 기본 설정인 자동 연결을 사용하는 것을 권장합니다.

가입 미완료자 연결 끊기 처리 사용자가 연결 대기 상태에서 24시간 안에 연결하기 API를 통해 연결 완료되지 않는다면, 가입 미완료자로 분류되어 카카오 API 플랫폼에서 연결 끊기 처리합니다. 연결 끊기 시 연결 끊기 알림 설정이 되어 있다면 콜백(Callback)이 전달되므로, 서비스에서도 해당 사용자에 대해 연결 끊기 요청 및 사용자 정보 삭제를 해야 합니다. 자세한 정보는 공지사항을 참고합니다.

액세스 토큰을 헤더에 담아 POST 로 요청합니다. 요청 시 properties 파라미터를 사용해 사용자 프로퍼티 값 저장을 함께 요청할 수 있습니다. 사용자 프로퍼티 값은 사용자 연결 후 사용자 정보 저장하기 API를 통해서도 저장할 수 있으며 연결 끊기 시 삭제됩니다.

참고: 사용자 연결 상태에 따른 사용자 정보 제공 범위

사용자가 앱과 연결하기 API를 통해 연결 완료되지 않은 연결 대기(Preregistered) 상태인 경우, 다음의 일부 사용자 정보만 사용자 정보 가져오기 및 여러 사용자 정보 가져오기 API를 통해 제공됩니다.

Name Key 회원번호 id 고유 ID uuid 프로필 정보(닉네임/프로필 사진) kakao_account.profile 연결 여부 has_signed_up 연결 시각 connected_at 카카오계정(이메일) kakao_account.email 유효 이메일 여부 is_email_valid 이메일 인증 여부 is_email_verified

Request

URL

POST /v1/user/signup HTTP/1.1 Host: kapi.kakao.com Authorization: Bearer ${ACCESS_TOKEN} Content-type: application/x-www-form-urlencoded;charset=utf-8

Header

Name Description Required Authorization 사용자 인증 수단, 액세스 토큰 값

Authorization: Bearer ${ACCESS_TOKEN} O

Parameter

Name Type Description Required properties JSON {“key”:”value”} 형태의 사용자 정보 리스트

연결하기 시 사용자 프로퍼티 값을 저장하고자 할 때 전달

사용자 프로퍼티 및 사용자 정보 저장하기 참고 X

Response

Name Type Description Required id Long 앱과 연결된 사용자 회원번호 O

Sample

Request: 사용자 프로퍼티 저장 없이 연결하기만 요청

curl -v -X POST “https://kapi.kakao.com/v1/user/signup” \ -H “Content-Type: application/x-www-form-urlencoded” \ -H “Authorization: Bearer ${ACCESS_TOKEN}”

Request: 연결하기 요청 시 사용자 프로퍼티 저장

curl -v -X POST “https://kapi.kakao.com/v1/user/signup” \ -H “Content-Type: application/x-www-form-urlencoded” \ -H “Authorization: Bearer ${ACCESS_TOKEN}” \ –data-urlencode ‘properties={“${CUSTOM_PROPERTY_KEY}”:”${CUSTOM_PROPERTY_VALUE}”}’

Response: 성공

HTTP/1.1 200 OK { “id”:1376016924429759228 }

Response: 실패, 앱과 이미 연결되어 있는 사용자인 경우

HTTP/1.1 400 Bad Request { “msg”:”already registered”, “code”:-102 }

Response: 실패, 요청 시 사용한 액세스 토큰이 유효하지 않은 경우

HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer error=invalid_token { “msg”:”this access token does not exist”, “code”:-401 }

Response: 실패, 앱에 설정돼 있지 않은 사용자 프로퍼티 저장을 요청한 경우

HTTP/1.1 400 Bad Request { “msg”:”user property not found ([gender, age] for appId=${APP_ID})”, “code”:-201 }

더보기

일반 보안 토큰 로그인 모듈을 사용하여 웹 서비스 인증

일반 보안 토큰 로그인 모듈에 대해 알아봅니다.

일반 보안 토큰 로그인 모듈은 WS-Trust Issue 및 WS-Trust Validate 요청을 사용하여 토큰을 생성하고 이용합니다. 이러한 요청을 통해 로그인 모듈은 IBM® Tivoli® Federated Identity Manager에 제공된 서비스와 같은 WS-Trust Security Token Service로 토큰을 발행 또는 교환하거나 유효성을 검증합니다.

키워드에 대한 정보 토큰 로그인

다음은 Bing에서 토큰 로그인 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 디스코드 토큰 로그인 하는 방법!

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기

디스코드 #토큰 #로그인 #하는 #방법!


YouTube에서 토큰 로그인 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 디스코드 토큰 로그인 하는 방법! | 토큰 로그인, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment