asp 사이트에서 네이버 로그인 사용 할 일이 생겨서 만들었다.
 NaverOAuth.asp<!--#include virtual="/lgdacom/md5.asp" -->
<!--#include virtual="/Class/json2.asp"-->
<%
Class clsNaverOAuth
	Private Sub Class_Initialize()
	End Sub
		private m_clientId
		private m_clientSecret
		private m_redirectUrl
		private m_state
		private m_session
		private m_code '로그인 인증 요청 API 호출에 성공하고 리턴받은 인증코드값 (authorization code)
		private m_refreshToken '갱신 때 필수	-	네이버 사용자 인증에 성공하고 발급받은 갱신 토큰(refresh token)
		private m_accessToken '삭제 때 필수	-	기 발급받은 접근 토큰으로 URL 인코딩을 적용한 값을 사용
	Public Property Get clientId()
	clientId = m_clientId
	End Property
	Public Property Let clientId(value)
	m_clientId = value
	End Property
	Public Property Get clientSecret()
	clientSecret = m_clientSecret
	End Property
	Public Property Let clientSecret(value)
	m_clientSecret = value
	End Property
	Public Property Get redirectUrl()
	redirectUrl = m_redirectUrl
	End Property
	Public Property Let redirectUrl(value)
	m_redirectUrl = value
	End Property
	Public Property Get state()
	state = m_state
	End Property
	Public Property Let state(value)
	m_state = value
	End Property
	Public Property Get session()
	session = m_session
	End Property
	Public Property Let session(value)
	m_session = value
	End Property
	Public Property Get refreshToken()
	refreshToken = m_refreshToken
	End Property
	Public Property Let refreshToken(value)
	m_refreshToken = value
	End Property
	Public Property Get accessToken()
	accessToken = m_accessToken
	End Property
	Public Property Let accessToken(value)
	m_accessToken = value
	End Property
	Public Property Get code()
	code = m_code
	End Property
	Public Property Let code(value)
	m_code = value
	End Property
    Public Property Get generate_state
        Dim rand, mt, state,returnVal
        Randomize
        rand = Int((999999 * Rnd) + 111111)
        mt = Timer
        generate_state = md5( mt & rand )
    End Property
	Public Property Get authQueryString()
        authQueryString = "response_type=code"
        authQueryString = authQueryString + "&client_id=" + m_clientId
        authQueryString = authQueryString + "&redirect_uri=" + Server.URLEncode(m_redirectUrl)
        authQueryString = authQueryString + "&state=" + Server.URLEncode(m_state)
	End Property
	Public Property Get tokenAuthQueryString()
        tokenAuthQueryString = "client_id=" + m_clientId
        tokenAuthQueryString = tokenAuthQueryString + "&client_secret=" + m_clientSecret
        tokenAuthQueryString = tokenAuthQueryString + "&grant_type=authorization_code"
        tokenAuthQueryString = tokenAuthQueryString + "&state=" + m_state	                '발급시
        tokenAuthQueryString = tokenAuthQueryString + "&code=" + m_code						'발급시
	End Property
	Public Property Get tokenRefreshQueryString()
        tokenRefreshQueryString = "client_id=" + m_clientId
        tokenRefreshQueryString = tokenRefreshQueryString + "&client_secret=" + m_clientSecret
        tokenRefreshQueryString = tokenRefreshQueryString + "&grant_type=refresh_token"
        tokenRefreshQueryString = tokenRefreshQueryString + "&refresh_token=" + m_refreshToken	'갱신시
	End Property
	Public Property Get tokenDeleteQueryString()
        tokenDeleteQueryString = "client_id=" + m_clientId
        tokenDeleteQueryString = tokenDeleteQueryString + "&client_secret=" + m_clientSecret
        tokenDeleteQueryString = tokenDeleteQueryString + "&grant_type=delete"
        tokenDeleteQueryString = tokenDeleteQueryString + "&access_token=" + m_accessToken		'삭제시
        tokenDeleteQueryString = tokenDeleteQueryString + "&service_provider=NAVER"				'삭제시
	End Property
    Public Function httpRequest(url, AuthTkn)
        Dim returnDic : Set returnDic = Server.CreateObject("Scripting.Dictionary")
		Dim objXMLHTTP : Set objXMLHTTP = server.CreateObject("MSXML2.ServerXMLHTTP")
		objXMLHTTP.setOption 2,13056 'ignore SSL errors
		objXMLHTTP.Open "POST", url, false
		If AuthTkn = "" Then
		    objXMLHTTP.setRequestHeader "Content-Type", "application/json;charset=UTF-8"
		Else
            objXMLHTTP.setRequestHeader "Content-Type", "application/xml"
            objXMLHTTP.setRequestHeader "Authorization", AuthTkn
		End If
		objXMLHTTP.Send
		If objXMLHTTP.status = 200 Then
		    'response.write(objXMLHTTP.responseText)
		    'response.end
		    Dim jsonstring : jsonstring = objXMLHTTP.responseText
            Dim Info : set Info = JSON.parse(join(array(jsonstring)))
            Dim key : for each key in Info.enumerate()
                returnDic.Add key, Info.get(key)
            next
		Else
		'에러처리
            returnDic.Add "error", "status is not 200"
		End if
		Set httpRequest = returnDic
    End Function
End Class
%>
인클루드 파일 설명
md5.aspstat 값을 생성할 때, asp 자체적으로는 md5 기능이 없어서 추가 했다.
네이버로그인 예제에 해당 기능을 사용하는 데 asp 는 그런 기능이 없다.
해당 사이트가 기존에 사용하고 있는 부분이여서
넣긴 했는데, md5 기능을 빼고 랜덤 함수만 사용하여도
크게 문제는 없을 것 같긴하다.
꼭 사용하려면 asp md5로 검색하면 역시 소스가 잘 나오기 때문에
추가하는데는 어렵지 않을 것이다. 
json2.asp네이버 리턴값을 json 으로 주기 때문에 넣어야 한다.
역시 asp 자체적으로 json 파싱기능이 없기 때문이다. 
사용법<%@Language="VbScript"%>
<!--#include virtual="/Class/NaverOAuth.asp"-->
<%
Dim NAVER_CLIENT_ID : NAVER_CLIENT_ID = "네이버클라이언트ID"
Dim NAVER_SECRET_KEY : NAVER_SECRET_KEY = "네이버비밀키"
Dim NAVER_REDIRECT_PC_URL : NAVER_REDIRECT_PC_URL =  "http://mysite.com/oauth/naver/callback.asp"
Dim NAVER_REDIRECT_MOB_URL : NAVER_REDIRECT_MOB_URL =  "http://m.mysite.com/naverLogin/callback.asp"
Dim NAVER_OAUTH_AUTHORIZE_URL : NAVER_OAUTH_AUTHORIZE_URL = "https://nid.naver.com/oauth2.0/authorize"
Dim NAVER_OAUTH_TOKEN_URL : NAVER_OAUTH_TOKEN_URL = "https://nid.naver.com/oauth2.0/token"
Dim NAVER_GET_USER_INFO_URL : NAVER_GET_USER_INFO_URL = "https://openapi.naver.com/v1/nid/me"
Dim clsOAuth : Set clsOAuth = new clsNaverOAuth
Session("NAVER_STATE") = clsOAuth.generate_state
clsOAuth.clientId = NAVER_CLIENT_ID
clsOAuth.state = Session("NAVER_STATE")
clsOAuth.redirectUrl = NAVER_REDIRECT_PC_URL
Dim queryString : queryString = clsOAuth.authQueryString
Response.redirect NAVER_OAUTH_AUTHORIZE_URL & "?" & queryString
%>
인클루드 파일 설명
첫번째 소스 내용을 /Class/NaverOAuth.asp 위치에 저장한 것을 불러오는 부분 
callback.asp<%@Language="VbScript"%>
<!--#include virtual="/Class/NaverOAuth.asp"-->
<%
Dim NAVER_CLIENT_ID : NAVER_CLIENT_ID = "네이버클라이언트ID"
Dim NAVER_SECRET_KEY : NAVER_SECRET_KEY = "네이버비밀키"
Dim NAVER_REDIRECT_PC_URL : NAVER_REDIRECT_PC_URL =  "http://mysite.com/oauth/naver/callback.asp"
Dim NAVER_REDIRECT_MOB_URL : NAVER_REDIRECT_MOB_URL =  "http://m.mysite.com/naverLogin/callback.asp"
Dim NAVER_OAUTH_AUTHORIZE_URL : NAVER_OAUTH_AUTHORIZE_URL = "https://nid.naver.com/oauth2.0/authorize"
Dim NAVER_OAUTH_TOKEN_URL : NAVER_OAUTH_TOKEN_URL = "https://nid.naver.com/oauth2.0/token"
Dim NAVER_GET_USER_INFO_URL : NAVER_GET_USER_INFO_URL = "https://openapi.naver.com/v1/nid/me"
Dim clsOAuth : Set clsOAuth = New clsNaverOAuth
Dim state : state = clsCom.CheckisTrim(Request.QueryString("state"))
Dim code : code = clsCom.CheckisTrim(Request.QueryString("code"))
Dim Error : Error = clsCom.CheckisTrim(Request.QueryString("error"))
Dim error_description : error_description = clsCom.CheckisTrim(Request.QueryString("error_description"))
If error <> "" Then
    response.write("error")
    response.write("<br>")
    response.write(error)
    response.write("<br>")
    response.write(error_description)
    response.end
End If
If Session("NAVER_STATE") <> state Then
    response.write("인증 실패")
    response.write("<br>")
    response.write(Session("NAVER_STATE"))
    response.write("<br>")
    response.write(state)
    response.write("<br>")
    response.end
End If
'''===전송할 파라미터 지정
clsOAuth.clientId = NAVER_CLIENT_ID
clsOAuth.state = state
clsOAuth.clientSecret = NAVER_SECRET_KEY
clsOAuth.code = code
'Response.write( clsOAuth.tokenAuthQueryString & vbNewline)
Dim respInfo
Dim profileInfo
Dim authToken
'토큰 발급 요청
Set respInfo = clsOAuth.httpRequest(NAVER_OAUTH_TOKEN_URL &"?"& clsOAuth.tokenAuthQueryString,"")
If respInfo.Exists("error")=true Then
    response.write("토큰 접속 요청 에러" & "<br>" )
    response.write(respInfo.Item("error") & "<br>" )
Else
    Session("NAVER_ACCESS_TOKEN") = respInfo.Item("access_token")
    Session("NAVER_REFRESH_TOKEN") = respInfo.Item("refresh_token")
    response.write(Session("NAVER_ACCESS_TOKEN") & "<br>" )
    response.write(Session("NAVER_REFRESH_TOKEN") & "<br>" )
    '프로필 정보 조회
    authToken = respInfo.Item("token_type") &" "& respInfo.Item("access_token")
    Set profileInfo = clsOAuth.httpRequest(NAVER_GET_USER_INFO_URL, authToken)
    If profileInfo.Item("resultcode") = 00 Then
                Dim key : for each key in profileInfo.Item("response").enumerate()
                    response.write(key & " : " & profileInfo.Item("response").get(key) & "<br>" )
                next
    Else
        response.write("프로필 조회 요청 에러" & "<br>" )
        response.write(profileInfo.Item("resultcode") & "<br>" )
        response.write(profileInfo.Item("message") & "<br>" )
    End If
End If
'Session 등록이 클래스 안에서 안됨.
'objXMLHTTP.Send 파라미터로 요청 하려고 했으나, 요청이 잘못 됐다는 에러메시지가 계속 나옴.
%>
 ps. 네이버로그인을 적용하면서 알 게 된 건데, 해당 기능은 OAUTH 2.0 기능을 사용하고
이 프로토콜은 IETF 표준으로 네이버만 사용하는 기술이 아닌 것이다.
페이스북, 트위터, 구글등 OAUTH 2.0 기능으로 로그인 기능을 제공 하고 있다.
ps2. 개발하면서 이상하다고 생각한게 토큰 갱신,삭제 부분이다. 몇몇 샘플 코드를 봐도
토큰 요청만 개발 해 놓고, 갱신, 삭제 부분은 만들어 놓지도 않았다.
이론적으로는 토큰 요청후  일정시간(expires_in )이 지나면 기존의 토큰은 사라지고 토큰 갱신을 해야 한다는 건데, 그렇게 하지 않아도 토큰 요청을 하면 새로운 토큰을 넘겨준다. 그러면 토큰 갱신이 별 의미가 없어 보인다.
또 토큰 삭제 역시 매뉴얼에는 어플리케이션 연동을 해제 할 때라고 나와 있지만 정작 네이버설정의 '외부 사이트 연결관리' 부분에는 연동한 사이트가 그대로 남아있다.
그에 대한 해답은 
여기에서 찾았다.
결론은 엑세스 토큰이 문제가 생겼거나, 보안 이슈를 최소화 하기 위해서 인것 같다.