
협력사와 진행했던 프로젝트 내용 중 로그인 연계 부분에 대해 정리해 보려고 한다. 😏
협력사에서는 OAuth 방식을 사내에서는 세션(Session) 방식을 사용하여 로그인 처리를 하는 상황이었다.
1. 사용자 접속 시도
2. 로그인 요청
3. accessToken 유효성 확인
4. 로그인 처리
1) 세션(Session) 방식
특징
장점
단점
개발 서버의 JSessionID들이 충돌되어 계속 로그아웃 되는 현상을 겪기도 했었다.. 🙄
2) Oauth(OpenID Authentication) 방식
@RequestMapping(value = "/test_login", produces="application/json;charset=UTF-8")
public ModelAndView test_login(@RequestParam Map<String, String> queryParameters, HttpServletResponse resp, HttpServletRequest req) throws Exception{
Map<String, String> returnMap = new HashMap<String, String>();
returnMap.put("accessToken", queryParameters.get("accessToken")); // 쿼리 스트링 방식으로 데이터 전달 받기
String jsonStr = gson.toJson(returnMap); // Object(map) -> json String
}
@RequestMapping(value = "/test_login", produces="application/json;charset=UTF-8")
public ModelAndView test_login(@RequestParam Map<String, String> queryParameters, HttpServletResponse resp, HttpServletRequest req) throws Exception{
// 1. 로그인 요청
Map<String, Object> return_map = new HashMap<>();
StringBuilder sb = new StringBuilder();
Map<String, String> returnMap = new HashMap<String, String>();
URL url = null;
HttpURLConnection conn = null;
OutputStreamWriter os = null;
BufferedReader br = null;
returnMap.put("accessToken", queryParameters.get("accessToken")); // 쿼리 스트링 방식으로 데이터 전달 받기
String jsonStr = gson.toJson(returnMap); // Object(map) -> json String
try {
// 2. accessToken 유효성 확인
url = new URL("https://www.haeni.co.kr/api/v1/auth");
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
} catch (MalformedURLException e) {
log.error("error msg : The URL address in incorrect!");
} catch (IOException e) {
log.error("error msg : it can't connect to the web page!");
}
BufferedReader br = null;
try {
int responseCode = conn.getResponseCode();
if( responseCode >= HttpURLConnection.HTTP_OK && responseCode < HttpURLConnection.HTTP_BAD_REQUEST) { // 정상 호출
br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
} else { // 에러 발생
br = new BufferedReader(new InputStreamReader(conn.getErrorStream(), "UTF-8"));
}
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line.trim());
}
return_map = gson.fromJson(sb.toString(), new TypeToken<HashMap<String, Object>>(){}.getType());
} catch (Exception e) {
log.info("err :" + sb.toString());
return_map.put("result", false);
} finally {
os.close();
br.close();
conn.disconnect();
}
return new ModelAndView("jsp/test/auth").addAllObjects(return_map);
}
// auth.jsp
<script type="text/javascript" src="/resource/js/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
if("${result}"=='true'){
let json = {
'result': "${result}"
,'id': "${id}"
,'dexpire': "${dexpire}"
,'status': "${status}"
};
check_id_branch(json)
} else {
alert("오류가 발생했습니다.");
location.href="https://haeni.co.kr" // 협력사 홈페이지로 이동
}
});
function check_id_branch(params) { // 응답 데이터 기준으로 그룹 조회
$.ajax({
method : "POST",
url : "/checkId",
data : JSON.stringify(params),
dataType : 'json',
contentType : 'Content-Type: application/json',
beforeSend : function(xhr) {
xhr.setRequestHeader("Content-type", "application/json");
},
success : function(data) {
if (data.status == '000') {
// 로그인 시도 ...
on_login(data)
} else { //if(data.status=='-100')
alert(data.msg);
location.href="https://haeni.co.kr"
}
},
error : function(jqXHR, textStatus, errorThrown) {
alert("오류가 발생했습니다.");
location.href="https://haeni.co.kr"
}
});
}
function on_login() {
var sendData = document.sendData;
sendData.action = '/login/open?from=haeni';
sendData.submit();
}
출처
https://choi-notion-blog.vercel.app/post/%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84-%EB%B0%A9%EC%8B%9D(JWT-,-Session-,-OAuth-2.0)-eda48fe7582440529050d5f00e721c80
https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-OAuth-20-%EA%B0%9C%EB%85%90-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC