반응형
네이버웍스 API를 연동하기 위해 서비스 계정 기반의 JWT 인증 방식을 사용할 수 있습니다.
이 글에서는 서비스 계정으로 JWT를 생성하고, Access Token을 발급받는 과정을 정리합니다.
Developers
developers.worksmobile.com
1. 준비물
JWT 인증을 위해 다음 4가지 정보를 준비해야 합니다.
- client_id
- client_secret
- service_account
- private_key
이 값들은 네이버웍스 관리자 포털 또는 개발자 포털에서 발급받을 수 있습니다.
인증 흐름
서비스 계정 인증은 다음과 같은 순서로 진행됩니다.
- JWT 토큰 생성
- JWT를 이용해 Access Token 발급
- Access Token을 이용해 API 호출
3. JWT 생성 방법
JWT는 RS256 알고리즘을 사용하여 서명해야 합니다.
아래는 Java 코드로 JWT를 생성하는 방법입니다.
private String generateJwt() {
try {
// JWT Header
String header = Base64.getUrlEncoder().withoutPadding()
.encodeToString("{\"alg\":\"RS256\",\"typ\":\"JWT\"}".getBytes());
// JWT Payload
long now = System.currentTimeMillis() / 1000;
Map<String, Object> payload = new HashMap<>();
payload.put("iss", CLIENT_ID);
payload.put("sub", SERVICE_ACCOUNT);
payload.put("iat", now);
payload.put("exp", now + 3600); // 1시간 유효
ObjectMapper mapper = new ObjectMapper();
String payloadJson = mapper.writeValueAsString(payload);
String encodedPayload = Base64.getUrlEncoder().withoutPadding()
.encodeToString(payloadJson.getBytes());
// Signature
String dataToSign = header + "." + encodedPayload;
byte[] signature = sign(dataToSign);
if(signature == null) {
log.debug("generateJwt() signature = null");
return null;
}
log.debug("generateJwt() signature = "+signature);
String encodedSignature = Base64.getUrlEncoder().withoutPadding().encodeToString(signature);
return header + "." + encodedPayload + "." + encodedSignature;
} catch (Exception e) {
e.printStackTrace();
log.debug("generateJwt() Exception e : "+e);
return null;
}
}
private static byte[] sign(String data) {
try {
// PEM 형식의 Private Key 파싱
String privateKeyPem = PRIVATE_KEY.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")
.replaceAll("\\s+", "");
byte[] keyBytes = Base64.getDecoder().decode(privateKeyPem);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data.getBytes());
return signature.sign();
} catch (Exception e) {
e.printStackTrace();
log.debug("sign() Exception e : "+e);
return null;
}
}
4. Access Token 발급 방법
JWT를 생성한 후, 이를 이용해 Access Token을 발급받습니다.
// generateJwt에서 생성한 jwt 값을 파라미터로
private String getAccessToken(String jwt) {
try {
// API Endpoint
URL url = new URL("https://auth.worksmobile.com/oauth2/v2.0/token");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setDoOutput(true);
// Request Body
String body = "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer"
+ "&assertion=" + jwt
+ "&client_id=" + CLIENT_ID
+ "&client_secret=" + CLIENT_SECRET
+ "&scope=user.read orgunit.read directory.read"; //지정된 범위의 정보만 요청
try (OutputStream os = conn.getOutputStream()) {
os.write(body.getBytes());
os.flush();
}
// Response 처리
if (conn.getResponseCode() == 200) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
response.append(line);
}
// JSON에서 access_token 추출
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> jsonResponse = mapper.readValue(response.toString(), Map.class);
log.debug("getAccessToken() jsonResponse = "+jsonResponse);
return (String) jsonResponse.get("access_token");
}
} else {
log.debug("getAccessToken() HTTP Error: " + conn.getResponseCode());
return null;
//throw new IOException("getAccessToken() HTTP Error: " + conn.getResponseCode());
}
} catch(Exception e) {
e.printStackTrace();
log.debug("getAccessToken() Exception e = "+e);
return null;
}
}
5. 참고사항 및 주의점
- Private Key는 외부에 절대 노출되지 않도록 주의해야 합니다.
- Access Token은 일정 시간(기본 1시간) 동안만 유효합니다. 만료되면 재발급이 필요합니다.
- 실제 API 호출 시 scope를 적절히 지정해야 원하는 데이터에 접근할 수 있습니다.
위 과정을 통해 네이버웍스 서비스 계정을 이용한 JWT 인증 및 Access Token 발급이 완료되었습니다.
Access Token을 발급받은 이후에는
네이버웍스의 다양한 API 엔드포인트를 호출하여 사용자 정보, 조직도 정보 등을 조회할 수 있습니다.
작성일: 2025년 4월 기준
※ 네이버웍스 API는 향후 업데이트에 따라 내용이 변경될 수 있습니다.
반응형
'Language > Java' 카테고리의 다른 글
[Java] 예외처리의 모든 것 (1) | 2025.04.30 |
---|---|
[Java] AES-256 암호화/복호화 하기 (0) | 2023.06.15 |
[Java] BigInteger 다루기 (백준 1247번 - 부호) (0) | 2023.04.12 |
[Java] 트리 구현하기 (이진트리, 전위순회, 중위순회, 후위순회) (0) | 2023.04.08 |
[Base64][암호화] + 기호가 " "(공백) 으로 바뀌는 현상 (0) | 2023.03.13 |
댓글